大家好/晚。 我是存储过程的新手,在存储过程方面我缺乏经验和理解。我尝试了其他教程和答案,但我不知道为什么我的查询在使用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。
答案 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...
)中不允许这样做。