SQL动态数据透视表类别名称1/0 0而不是null

时间:2016-05-11 14:02:10

标签: sql-server pivot

我的数据如下:

Name   CategoryName
Test1  cat1
Test1  cat2
Test2  cat1
Test3  cat2

我想显示它,以便在类别名称下获得1/0(真/假)的用户列表:

Name   cat1  cat2
Test1  1     1
Test2  1     0
Test3  0     1

使用以下sql我可以生成1但我无法弄清楚如何获得0。

注意:获取类别中用户的sql与我实际使用的内容相比非常简单,因此可能不完全正确

 DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.CategoryName) 
            FROM   Category c 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

        set @query = 'SELECT Name, ' + @cols + ' from 
            (
                SELECT Name 
                       CategoryName,
                            1 as assigned
                FROM        User INNER JOIN
                      UserCategory ON User.ID = UserCategory.UserID             

           ) x
            pivot 
            (
                 max(assigned)
                for CategoryName in (' + @cols + ')
            ) p '

            execute(@query)

我可以更新它以生成1/0,而不是1 / null吗?

编辑 - 解决方案 感谢@Tab Allerman

我更新了这个,所以我有2个cols变量

SET @colsForSelect = STUFF((SELECT distinct ', ISNULL(' + QUOTENAME(c.CategoryName) + ',0) AS ' + QUOTENAME(c.CategoryName)
            FROM   Category c 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

并保留原来的@cols。 我在查询的开头使用了@colsForSelect,然后在'枢轴中使用了@cols的原始@cols。 我希望这对任何需要帮助的人都有意义

1 个答案:

答案 0 :(得分:0)

SET @cols = STUFF((SELECT distinct ', ISNULL(' + QUOTENAME(c.CategoryName) + ',0) AS ' + QUOTENAME(c.CategoryName)