SQL SERVER Замена нулевого значения в динамическом 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 был установлен на другую дату (это зависит от ввода пользователя из графического интерфейса).

Как я могу заменить нулевое значение на 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.


person Sephiroth111    schedule 02.06.2013    source источник


Ответы (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...).

person bobs    schedule 02.06.2013
comment
как я могу изменить столбцы внутри IN (), если он имеет фиксированное имя столбца? - person Sephiroth111; 02.06.2013
comment
Вы все еще можете использовать аналогичный метод, когда вы создаете предложение SELECT в переменной @SQL, но вам нужно создать предложение FOR ... IN с другой переменной. - person bobs; 02.06.2013