#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
. - Для сравнения дат используйте прямое сравнение дат. Это позволяет использовать индекс, если это необходимо.