【问题标题】:Pivot cateorical values into boolean columns SQL将分类值转换为布尔列 SQL
【发布时间】:2012-08-16 10:56:33
【问题描述】:

我正在寻找“扁平化”我的数据集以促进数据挖掘。 每个分类列应更改为多个布尔列。 我有一列包含分类值,例如:

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

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    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

    【讨论】:

    • 这个选项应该至少涵盖一个ID可以有A B的可能性,因此有一个GROUP BY,并且可能使用MAX()
    • 谢谢!我只需要想出一种动态的方法,因为我不知道 col1 的选项数量。除了游标还有什么办法吗?
    • @Omri374:我已经更新了我对动态数据透视的查询。请立即查看
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2015-08-23
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多