0

祝大家早日/晚安。我是存储过程的新手,在存储过程方面我缺乏经验和理解。我尝试了其他教程和答案,但我不知道为什么我的查询在使用 isnull(payment,'0') 或 coalesce(payment,'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。

4

1 回答 1

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...

于 2013-06-02T03:11:40.123 回答