如何用SUM(NVL)改写统计MYR及空值的SQL代码?
用NVL改写你的统计SQL
嘿,我来帮你搞定这个问题!原来的CASE WHEN逻辑没问题,但既然你想用NVL来改写,我们可以这样做:
首先,我们利用NVL()函数把CURRENCY列的空值替换成**'MYR'**,然后判断替换后的值是否等于'MYR',再用SUM统计符合条件的记录数。这样既符合你的需求,逻辑也更清晰:
SUM(CASE WHEN NVL(D.CURRENCY, 'MYR') = 'MYR' THEN 1 ELSE 0 END) AS Cur
补充说明:
- 这里
NVL函数的第二个参数是**'MYR',也就是把所有CURRENCY为NULL的记录替换成'MYR'** - 替换后,只要值是'MYR'(不管原本就是MYR还是替换后的),我们就计数1,否则0
- 如果你的数据库支持布尔值的隐式转换(比如Oracle),还可以简化成更短的写法:
SUM(CASE WHEN NVL(D.CURRENCY, 'MYR') = 'MYR' THEN 1 END) AS Cur
(因为CASE WHEN不满足条件时会返回NULL,SUM函数会自动忽略NULL值,效果和上面的代码一致)
逻辑验证示例
假设你的CURRENCY列有这些数据:
'MYR', NULL, 'USD', 'MYR', 'SGD', NULL
经过NVL(D.CURRENCY, **'MYR'**)处理后,数据会变成:
'MYR', 'MYR', 'USD', 'MYR', 'SGD', 'MYR'
统计出来的结果就是4,完全符合你想要统计MYR和空值的需求。
内容的提问来源于stack exchange,提问作者zakira
相关产品推荐
相关产品推荐

