MySQL查询中如何排除0值统计usdAmount的计数?
解决COUNT(usdAmount)统计0值的问题
嘿,我懂你的困扰——COUNT(usdAmount)会把所有非NULL的记录都算进去,哪怕usdAmount是0,这确实不是你想要的结果。要忽略值为0的计数,我们可以用条件计数的方式来实现,这里有两种常用的靠谱方法:
方法1:CASE表达式配合COUNT
COUNT函数只会统计非NULL的值,所以我们可以用CASE语句,当usdAmount不等于0时返回1(或者任意非NULL值),否则默认返回NULL,这样COUNT就会自动忽略那些0的记录:
SELECT monthPosted, sector, COUNT(sumaAbas) as abasNum, SUM(sumaAbas) as abas, COUNT(CASE WHEN usdAmount != 0 THEN 1 END) AS totalNum, -- 忽略0的计数 SUM(usdAmount) AS total FROM DatosSpend WHERE negotiableProcGl='Y' GROUP BY sector, monthPosted -- 注意:这里建议加上monthPosted,否则SELECT里的monthPosted会不符合GROUP BY规则(不同SQL模式下可能报错)
方法2:SUM配合CASE
另一种思路是用SUM来模拟计数,当usdAmount不等于0时加1,否则加0,这样得到的结果就是排除0后的有效记录数:
SELECT monthPosted, sector, COUNT(sumaAbas) as abasNum, SUM(sumaAbas) as abas, SUM(CASE WHEN usdAmount != 0 THEN 1 ELSE 0 END) AS totalNum, -- 同样忽略0的计数 SUM(usdAmount) AS total FROM DatosSpend WHERE negotiableProcGl='Y' GROUP BY sector, monthPosted
额外小提醒
你的原始查询里SELECT包含monthPosted但GROUP BY只有sector,这在大多数SQL数据库的严格模式下会报错(因为monthPosted既不是聚合列也不在GROUP BY分组字段里),所以建议把monthPosted也加到GROUP BY子句中,这样分组统计的结果才是准确的。
如果usdAmount可能存在NULL值,上面的两种方法依然有效——因为CASE语句里usdAmount !=0会自动过滤掉NULL(NULL和任何值比较都是UNKNOWN,不会进入THEN分支),最终计数会同时排除NULL和0的记录。
内容的提问来源于stack exchange,提问作者KmiArthur
相关产品推荐
相关产品推荐

