[英]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 Aggregate
将AlarmType
为列并在每个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.