【问题标题】:SQL rows to columns (Pivot with just bit values)SQL 行到列(仅使用位值进行透视)
【发布时间】:2015-02-05 00:32:17
【问题描述】:

我正在尝试将结果行转换为列,但仅使用位值。为了更好地解释我的意思,我的桌子看起来像这样;

Id    Item
-------------------
1     TextLineA
1     TextLineB
2     TextLineA

而我想要实现的是这样的布局;

Id TextLineA  TextLineB
--------------------------
1     True       True
2     True       False

为我糟糕的格式道歉,但希望它传达了我正在寻找的东西。我已经尝试过 Pivot,但我没有什么可以总结的,因为我只想要真/假值而不是总和。

另外,我有大约 15 列,我不介意将它们静态地写出来。任何指针将不胜感激!

【问题讨论】:

  • 是什么导致结果中的真假?源中是否存在文本列?在这一点上我很困惑。
  • 只是它们存在于原始表中的事实。我需要这些值作为列标题

标签: sql sql-server tsql


【解决方案1】:

这种方法可以解决这个问题:

DECLARE @Example TABLE (Id int, Item varchar(20))

INSERT INTO @Example (ID, Item)
SELECT 1, 'TextLineA' UNION ALL
SELECT 1, 'TextLineB' UNION ALL
SELECT 2, 'TextLineA' UNION ALL
SELECT 3, 'TextLineA' UNION ALL
SELECT 3, 'TextLineB' UNION ALL
SELECT 3, 'TextLineC' 

select ID, 
  MAX(CASE WHEN Item='TextLineA' THEN 1 ELSE 0 END) as TextLineA,
  MAX(CASE WHEN Item='TextLineB' THEN 1 ELSE 0 END) as TextLineB,
  MAX(CASE WHEN Item='TextLineC' THEN 1 ELSE 0 END) as TextLineC
FROM @Example
GROUP BY ID

这会导致:

ID  TextLineA   TextLineB   TextLineC
1   1           1           0
2   1           0           0
3   1           1           1

1 为真,0 为假。

【讨论】:

【解决方案2】:

使用Pivot

SELECT id,
       CASE WHEN [TextLineA] IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END [TextLineA],
       CASE WHEN [TextLineB] IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END [TextLineB]
FROM   Yourtable
       PIVOT (Max(Item)
             FOR item IN ([TextLineA],[TextLineB])) piv 

【讨论】:

    【解决方案3】:

    尝试使用 case 语句?

    SELECT
        CASE MakeFlag
            WHEN 1 THEN 'True'
            WHEN 0 THEN 'False'
        END
    FROM [AdventureWorks2012].[Production].[Product]
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2021-01-21
      • 2016-04-15
      相关资源
      最近更新 更多