繁体   English   中英

如何在SQL Server中选择行到列

[英]How to select rows to columns in SQL Server

我不知道有没有迭代游标和填充临时表的可能性。 我很难选择如下所示的数据:

+----------+-----------+-----------+
|TypeName  | AlarmType | AlarmCount|
+----------+-----------------------+
|Antibody  | 1         | 2         |
|Bacterium | 1         | 2         |
|Bacterium | 3         | 2         |
|CellLine  | 1         | 2         |
+----------+-----------+-----------+

变成这样的结果(有3种不同的AlarmType,但列出了2种):

+----------+-------+-------+-------+
|TypeName  | Alarm1| Alarm2| Alarm3|
+----------+-------+-------+-------+
|Antibody  | 2     | 0     | 0     |
|Bacterium | 2     | 0     | 2     |
|CellLine  | 2     | 0     | 0     |
+----------+-------+-------+-------+

如您所见, AlarmCount现在显示在对应的AlarmType ,该列现在在此栏中。 如果不可能做到这一点,那么“没有光标就无法做到”也是一个很好的答案。

这是我的小提琴

您可以通过两种方式执行此操作。

使用Conditional AggregateAlarmType为列并在每个AlarmType下显示相应的AlarmCount

SELECT TypeName,
       Max(CASE WHEN AlarmType = 1 THEN AlarmCount ELSE 0 END) Alarm1,
       Max(CASE WHEN AlarmType = 2 THEN AlarmCount ELSE 0 END) Alarm2,
       Max(CASE WHEN AlarmType = 3 THEN AlarmCount ELSE 0 END) Alarm3
FROM   alarms
GROUP  BY TypeName

也可以通过Pivot完成

SELECT TypeName,
       Isnull([1], 0) Alarm1,
       Isnull([2], 0) Alarm2,
       Isnull([3], 0) Alarm3
FROM   (SELECT *
        FROM   alarms) a
       PIVOT (Max(AlarmCount)
             FOR AlarmType IN([1],
                              [2],
                              [3])) piv 

注意:如果您不知道AlarmType列,则可能必须使用Dynamic Pivot

这是UNION方法:

SELECT Alarm_Type_Name, SUM(Alarm1) AS Alarm1, SUM(Alarm2) AS Alarm2, SUM(Alarm3) AS Alarm3 FROM
(
SELECT TypeName AS Alarm_Type_Name, SUM(AlarmCount) AS Alarm1, 0 AS Alarm2, 0 AS Alarm3 FROM ALARM_TEMP
WHERE AlarmType = 1
GROUP BY TypeName, AlarmCount

UNION 

SELECT TypeName AS Alarm_Type_Name, 0 AS Alarm1, SUM(AlarmCount) AS Alarm2, 0 AS Alarm3 FROM ALARM_TEMP
WHERE AlarmType = 2
GROUP BY TypeName, AlarmCount

UNION 

SELECT TypeName AS Alarm_Type_Name, 0 AS Alarm1, 0 AS Alarm2, SUM(AlarmCount) AS Alarm3 FROM ALARM_TEMP
WHERE AlarmType = 3
GROUP BY TypeName, AlarmCount

)a

GROUP BY Alarm_Type_Name

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM