SQL SERVER替换动态PIVOT中的空值

时间:2013-06-02 01:34:02

标签: sql-server dynamic-pivot

大家好/晚。 我是存储过程的新手,在存储过程方面我缺乏经验和理解。我尝试了其他教程和答案,但我不知道为什么我的查询在使用isnull(付款,'0')或合并(付款,'0')时无效。

declare @sql as nvarchar(max) = '[2013-04-01],[2013-04-02],[2013-04-03],[2013-04-04],[2013-04-05],[2013-04-06]';
declare @name as nvarchar(max) = 'Derichel'
set @sql =
'SELECT pid, [Fullname], ' + @sql + '
FROM
(SELECT pid, [Fullname], payment, dateregistration
from tbl_Personal
) AS s
PIVOT
(
min(payment)
FOR dateregistration IN (' + @sql + ')
) AS pvt
where [Fullname] = ''' + @name + '''
order by pid'
execute sp_executesql @sql;

一些答案​​和教程在IN()中修复了列。 我的@sql已被设置为不同的日期(它取决于来自gui的用户输入)。

如何将空值替换为0?

上述代码的输出是

pid Fullname [2013-04-01] [2013-04-02] [2013-04-03] [2013-04-04] [2013-04-05] [2013-04-06]

6   Derichel     NULL         NULL          NULL         NULL        NULL           0

我想将null替换为0。

1 个答案:

答案 0 :(得分:1)

您将获得NULL值,因为日期没有行。当您尝试在根查询(ISNULL)上包含SELECT ... FROM tbl_Personal函数时,无需修改(该行不存在)。

NULL值显示为PIVOT操作的结果,因此您需要在数据轮转后应用ISNULL。查看它的另一种方法是将ISNULL应用于最终结果的定义,这是第一个SELECT子句。

这是没有动态数据透视查询格式的SQL语句。

SELECT pid, [Fullname],
  ISNULL([2013-04-01], 0) AS [2013-04-01],
  ISNULL([2013-04-02], 0) AS [2013-04-02],
  ISNULL([2013-04-03], 0) AS [2013-04-03],
  ISNULL([2013-04-04], 0) AS [2013-04-04],
  ISNULL([2013-04-05], 0) AS [2013-04-05],
  ISNULL([2013-04-06], 0) AS [2013-04-06]
FROM
(SELECT pid, [Fullname], payment, dateregistration
from tbl_Personal
) AS s
PIVOT
(
min(payment)
FOR dateregistration IN ([2013-04-01],[2013-04-02],[2013-04-03],[2013-04-04],[2013-04-05],[2013-04-06])
) AS pvt
where [Fullname] = 'Derichel'
order by pid

对于动态查询,您将无法在现在使用它的两个地方使用@SQL变量。第一个实例将包含ISNULL函数调用,在第二个实例(FOR dateregistration IN...)中不允许这样做。