我的代码是:
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
'
)
答案 0 :(得分:0)
如果我理解正确,您只需要column_3
中column_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
'
)