将分类值转换为布尔列SQL

时间:2012-08-21 05:47:05

标签: sql tsql pivot sql-server-2012 data-manipulation

我希望'压平'我的数据集以便于数据挖掘。 每个分类列应更改为多个布尔列。 我有一个带有分类值的列,例如:

 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中的类别数量未知,因此解决方案必须是动态的。 谢谢:))

1 个答案:

答案 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)


SQL Fiddle Demo