我的源数据表是
MemID Condition_ID Condtion_Result
----------------------------------
1 C1 0
1 C2 0
1 C3 0
1 C4 1
2 C1 0
2 C2 0
2 C3 0
2 C4 0
我想创建的预期视图是......
MemID C1 C2 C3 C4
------------------
1 1 0 0 1
2 0 0 0 1
这是另一个条件。 在上面的源表示例中,给定MemID只有4行。这个数字会因实际情况而有所不同。我的数据透视表(或任何其他解决方案)应该选择任意数量的条件结果并将其显示为列。 怎么做?
答案 0 :(得分:22)
您需要使用PIVOT
。您可以使用STATIC PIVOT,其中您知道要转换的列的值,或者使用DYNAMIC PIVOT,其中列是未知的,直到执行时间。
静态数据透视(参见SQL Fiddle with Demo):
select *
from
(
select memid, Condition_id, Condition_Result
from t
) x
pivot
(
sum(condition_result)
for condition_id in ([C1], [C2], [C3], [C4])
) p
动态数据透视(参见SQL Fiddle with Demo):
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.condition_id)
FROM t c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT memid, ' + @cols + ' from
(
select MemId, Condition_id, condition_result
from t
) x
pivot
(
sum(condition_result)
for condition_id in (' + @cols + ')
) p '
execute(@query)
两者都会产生相同的结果。