如何在SQL Server中选择行到列

dll*_*ell 1 sql t-sql sql-server

我不知道是否可以在没有迭代游标和填充临时表的情况下进行操作.我无法选择如下所示的数据:

+----------+-----------+-----------+
|TypeName  | AlarmType | AlarmCount|
+----------+-----------------------+
|Antibody  | 1         | 2         |
|Bacterium | 1         | 2         |
|Bacterium | 3         | 2         |
|CellLine  | 1         | 2         |
+----------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

进入这样的结果(有3种不同的AlarmType但列出了2种):

+----------+-------+-------+-------+
|TypeName  | Alarm1| Alarm2| Alarm3|
+----------+-------+-------+-------+
|Antibody  | 2     | 0     | 0     |
|Bacterium | 2     | 0     | 2     |
|CellLine  | 2     | 0     | 0     |
+----------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

如您所见,AlarmCount现在显示在相应的下面AlarmType,现在是列.如果不可能做到这一点,"没有游标就不能这样做",这也是一个很好的答案.

这是我的小提琴

Pரத*_*ீப் 5

你可以用两种方式做到这一点.

用于Conditional Aggregate转置AlarmType到列并AlarmCount在每个列下显示相应的AlarmType.

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
Run Code Online (Sandbox Code Playgroud)

它可以通过做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 
Run Code Online (Sandbox Code Playgroud)

注意:如果您不知道AlarmType列,那么您可能需要使用Dynamic Pivot