在pivot中将动态列与空值相加

时间:2016-08-04 11:40:48

标签: sql sql-server

我的代码是:

DECLARE @cols AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.column_3) 
        FROM table_c c
        where Code = 123 
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

exec('SELECT column_1, ' + @cols + ' from
        (
            select column_1
                , column_2
                , column_3
            From table_c where Code = 123 
        ) x 
        pivot 
        (
             sum(column_2)
            for column_3 in( ' + @cols + ' )
        ) p 
        '
        )

我想只添加@cols列,并导致新列为total。这些列可能具有空值。

让我解释一下:

需要一个能给我这样的代码

@sum_cols = 'ISNULL([c.column_3_value_1],0) + ISNULL([c.column_3_value_2],0) + ... + ISNULL([c.column_3_value_N],0)'

我的方式

@cols = '[c.column_3_value_1],[c.column_3_value_1],...[c.column_3_value_N]'

在上面的代码中。

(这个' c.column_3_value _...' s可能有任何字符并且不常规)

并在我的exec查询中使用此@sum_cols,如下所示:

exec('SELECT column_1, ' + @cols + ' , ' + @sum_cols + ' As sum from
    (
        select column_1
            , column_2
            , column_3
        From table_c where Code = 123 
    ) x 
    pivot 
    (
         sum(column_2)
        for column_3 in( ' + @cols + ' )
    ) p 
    '
    )

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您只需要column_3column_2中相应值至少有一个非NULL值的值。

您可以使用带有GROUP BY子句的HAVING来安排此操作:

SET @cols = STUFF((SELECT ',' + QUOTENAME(c.column_3) 
                   FROM table_c c
                   WHERE Code = 123 
                   GROUP BY c.column_3
                   HAVING COUNT(column_2) > 0
                   FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)'
                         ), 1, 1, '');

HAVING子句可以扩展用于其他目的 - 例如确保最小计数或保证所有列都具有值。但我认为这是你想要的版本。

答案 1 :(得分:0)

你是说这个吗?

我认为你在exec之后的第一个子查询之前忘记了'from'关键字... 你粘贴的代码不会以其他方式运行......

DECLARE @cols AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.column_3) 
        FROM table_c c
        where Code = 123 
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

exec('SELECT column_1, ' + @cols + '
        FROM 
        (
            select column_1
                , column_2
                , column_3
            From table_c where Code = 123 
        ) x 
        pivot 
        (
             sum(column_2)
            for column_3 in( ' + @cols + ' )
        ) p 
        '
        )