TSQL表转换字段=>列

Geo*_*ton 1 sql t-sql sql-server pivot

我有以下表格布局.每个行值始终是唯一的.永远不会有多个相同的Id,Name和Line实例.

Id Name Line
1  A    Z
2  B    Y
3  C    X
3  C    W
4  D    W
Run Code Online (Sandbox Code Playgroud)

我想查询数据,以便Line字段成为一列.如果该值存在,则在字段数据中应用1,否则为0

Id Name Z Y X W
1  A    1 0 0 0
2  B    0 1 0 0
3  C    0 0 1 1
4  D    0 0 0 1
Run Code Online (Sandbox Code Playgroud)

字段名称W,X,Y,Z只是字段值的示例,因此我无法应用运算符来显式检查,例如,"X","Y"或"Z".这些可以随时改变,并且不限于一组有价值的值.结果集中的列名称应将唯一字段值反映为列.

知道我怎么能做到这一点?

OMG*_*ies 6

这是一个标准的数据透视查询.

如果1表示布尔指示符 - 使用:

  SELECT t.id,
         t.name,
         MAX(CASE WHEN t.line = 'Z' THEN 1 ELSE 0 END) AS Z,
         MAX(CASE WHEN t.line = 'Y' THEN 1 ELSE 0 END) AS Y,
         MAX(CASE WHEN t.line = 'X' THEN 1 ELSE 0 END) AS X,
         MAX(CASE WHEN t.line = 'W' THEN 1 ELSE 0 END) AS W
    FROM TABLE t
GROUP BY t.id, t.name
Run Code Online (Sandbox Code Playgroud)

如果1表示具有该组值的记录数,请使用:

  SELECT t.id,
         t.name,
         SUM(CASE WHEN t.line = 'Z' THEN 1 ELSE 0 END) AS Z,
         SUM(CASE WHEN t.line = 'Y' THEN 1 ELSE 0 END) AS Y,
         SUM(CASE WHEN t.line = 'X' THEN 1 ELSE 0 END) AS X,
         SUM(CASE WHEN t.line = 'W' THEN 1 ELSE 0 END) AS W
    FROM TABLE t
GROUP BY t.id, t.name
Run Code Online (Sandbox Code Playgroud)