通过 SQL Pivot 将“NULL”值替换为“0”
Posted
技术标签:
【中文标题】通过 SQL Pivot 将“NULL”值替换为“0”【英文标题】:Replace "NULL" values to "0" via SQL Pivot 【发布时间】:2021-01-12 00:29:36 【问题描述】:美好的一天!我被我的查询困住了。我想将我的 NULL 值替换为零。
我的语法:
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
给朋友打电话。有人可以调查一下并检查我的语法吗?我很感激任何反馈。谢谢!
我的输出:
【问题讨论】:
附带说明,您应该真正避免使用旧式连接并使用显式连接 我建议您对每一列使用 case-when-else 子句。像这样:[January] 为 NULL 然后 0.0 的情况,否则 [January] 结束 【参考方案1】:您可以通过IsNull()
指定列/值,而不是顶部SELECT *
示例
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
。
对于日期比较,请使用直接日期比较。这允许在适当的情况下使用索引。
【讨论】:
以上是关于通过 SQL Pivot 将“NULL”值替换为“0”的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0