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