简体   繁体   English

如何在动态数据透视SQL中使用ISNULL?

[英]How can I use ISNULL in dynamic pivot sql?

I have a table like below, when I'm using dynamic pivot everything is ok till I want to sum all rows. 我有一个如下表,当我使用动态数据透视时,一切正常,直到我想对所有行求和。 I have a problem to change NULL's into 0. In which part of query should put the ISNULL function? 我在将NULL更改为0时遇到问题。应在查询的哪一部分放入ISNULL函数?

table: 表:

klucz      logid_do_zliczenia   duration
556267831171038 1171038 1058
556267831171038 1171038 54
556267831170688 1170688 72
556267831171038 1171038 59
556267831170688 1170688 46
556267831171038 1171038 54
556267831170688 1170688 42
556267831171038 1171038 12
556267831170634 1170634 112
556267831170634 1170634 53
556267831141392 1141392 77
556290551161102 1161102 32
556290551140814 1140814 249
556290551140814 1140814 43
556290551140814 1140814 105
556290551140814 1140814 40
556290551140814 1140814 304
556290551140814 1140814 61
556290551150534 1150534 351
556290551150534 1150534 76
556290551141170 1141170 238

Query: 查询:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);             

SET @Columns = (SELECT  N', p.' + QUOTENAME(REPLACE(CONVERT(VARCHAR(max), p.logid_do_zliczenia, 111), '/', '-'))
                FROM    #3 AS p
                GROUP BY p.logid_do_zliczenia
                ORDER BY p.logid_do_zliczenia
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)');            



SET @sql = N'SELECT klucz, ' + STUFF(@columns, 1, 2, '') + ',

Suma = ' + STUFF(REPLACE(@columns, ', p.[', ' + p.['), 1, 3, '') + '
FROM
(
  SELECT p.logid_do_zliczenia, p.klucz, p.duration FROM #3 AS p
) AS j
PIVOT
(
  SUM(duration) FOR logid_do_zliczenia IN ('+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')
) AS p;';
EXEC sp_executesql @sql;

How can I change it? 我该如何更改?

Try this 尝试这个

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);             

SET @Columns = (SELECT  N', p.' + QUOTENAME(REPLACE(CONVERT(VARCHAR(max), p.logid_do_zliczenia, 111), '/', '-'))
                FROM    #3 AS p
                GROUP BY p.logid_do_zliczenia
                ORDER BY p.logid_do_zliczenia
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)');            



SET @sql = N'SELECT klucz, ' + STUFF(@columns, 1, 2, '') + ',

Suma = ' + STUFF(REPLACE(@columns, ', p.[', ',0) + ISNULL(p.['), 1, 3, '') + ',0)
FROM
(
  SELECT p.logid_do_zliczenia, p.klucz, p.duration FROM #3 AS p
) AS j
PIVOT
(
  SUM(duration) FOR logid_do_zliczenia IN ('+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')
) AS p;';

EXEC sp_executesql @sql;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM