Замените значения «NULL» на «0» с помощью SQL Pivot

#sql #sql-server #pivot

#sql #sql-сервер #сводная

Вопрос:

Добрый день! Я застрял со своим запросом. Я хочу заменить свои нулевые значения на нули.

Мой синтаксис:

 SELECT * FROM (SELECT (B.FIRST_NAME   ' '   B.MIDDLE_INITIAL   ' '   B.SURNAME) As 'Name', DATENAME(MONTH, A.COVERAGE_DATE) As 'Month', SUM(ISNULL((A.AMOUNT),0)) As 'Amount' 
FROM Transactions A, PledgerProfile B 
WHERE A.PLEDGER_ID = B.PLEDGER_ID AND DATENAME(Year, A.COVERAGE_DATE) = '2021' 
GROUP BY (B.FIRST_NAME   ' '   B.MIDDLE_INITIAL   ' '   B.SURNAME), DATENAME(MONTH, A.COVERAGE_DATE)) AS MonthlySalesData 
PIVOT(SUM(AMOUNT) 
FOR Month IN ([January],[February],[March],[April],[May], [June],[July],[August],[September],[October],[November], [December])) AS MNamePivot
 

Звоню другу. Может кто-нибудь заглянуть в него и проверить мой синтаксис? Я ценю любую обратную связь. Спасибо!

Мой вывод:

Мой вывод

Комментарии:

1. Кроме того, вам действительно следует избегать объединений в старом стиле и использовать явное объединение

2. Я бы посоветовал вам использовать предложение case-when-else для каждого столбца. Например: случай, когда [январь] равен нулю, тогда 0.0 еще [Январь] заканчивается

Ответ №1:

Вместо top SELECT * вы можете указать столбцы / значения через IsNull()

Пример

 SELECT Name
      ,[January]   = isnull([January],0)
      ,[February]  = isnull([February],0)
      ,[March]     = isnull([March],0)
      ,[April]     = isnull([April],0)
      ,[May]       = isnull([May],0)
      ,[June]      = isnull([June],0)
      ,[July]      = isnull([July],0)
      ,[August]    = isnull([August],0)
      ,[September] = isnull([September],0)
      ,[October]   = isnull([October],0)
      ,[November]  = isnull([November],0)
      ,[December]  = isnull([December],0)
      ....
 

Ответ №2:

Просто используйте условную агрегацию:

 select (pp.FIRST_NAME   ' '   pp.MIDDLE_INITIAL   ' '   pp.SURNAME) As 'Name',
       sum(case when month(t.coverage_date) = 1 then 1 else 0 end) as jan,
       sum(case when month(t.coverage_date) = 2 then 1 else 0 end) as feb,
       . . .
from Transactions t join
     PledgerProfile pp 
     on pp.PLEDGER_ID = t.PLEDGER_ID 
where t.coverage_date >= '2021-01-01' and t.coverage_date < '2022-01-01'
group by (pp.FIRST_NAME   ' '   pp.MIDDLE_INITIAL   ' '   pp.SURNAME);
 

Подзапрос не требуется.

Примечания:

  • Никогда не используйте запятую в FROM предложении. Всегда используйте правильный, явный, стандартный, читаемый JOIN синтаксис.
  • Используйте значимые псевдонимы таблиц, а не произвольные буквы, такие как a и b .
  • Для сравнения дат используйте прямое сравнение дат. Это позволяет использовать индекс, если это необходимо.