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".这些可以随时改变,并且不限于一组有价值的值.结果集中的列名称应将唯一字段值反映为列.
知道我怎么能做到这一点?
这是一个标准的数据透视查询.
如果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)