SQL SERVER Замена нулевого значения в динамическом PIVOT

Доброго всем дня и ночи. Я новичок в хранимых процедурах, у меня нет опыта и понимания, когда речь идет о хранимых процедурах. Я попробовал другой учебник и ответы, но я не знаю, почему мой запрос не работал при использовании 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

я хочу заменить ноль на 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...).

Другие вопросы по тегам