我希望'压平'我的数据集以便于数据挖掘。 每个分类列应更改为多个布尔列。 我有一个带有分类值的列,例如:
ID col1
1 A
2 B
3 A
我正在寻找一种方法来转动这个表,并有一个聚合函数告诉我这个ID是否有值A或B:
结果:
ID col1A col1B
1 1 0
2 0 1
3 1 0
我尝试使用PIVOT,但不知道在其中使用哪个聚合函数。
还在SF寻找答案但找不到任何答案......
我正在使用MS-SQL 2012。
任何帮助将不胜感激! 欧米
编辑:
col1中的类别数量未知,因此解决方案必须是动态的。 谢谢:))
答案 0 :(得分:9)
试试这个:
select ID,
col1A=(case when col1='A' then 1 else 0 end),
col1B=(case when col1='B' then 1 else 0 end)
from <table>
如果您有一个同时包含A和B的ID,并且您希望在输出中具有不同的ID
select ID,
col1A=max(case when col1='A' then 1 else 0 end),
col1B=max(case when col1='B' then 1 else 0 end)
from <table>
group by id
编辑
根据你的评论,如果你不知道col1的选项数量,那么你可以选择动态PIVOT
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1)
from <table>
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + ' from <table>
pivot
(
count([col1])
for col1 in (' + @cols + ')
) p '
print(@query)
execute(@query)