SQL Server月度数据查询:如何高效统计值大于0的列数?
解决SQL Server中统计多列大于0的列数问题
针对你需要统计每行Jan、Feb、Mar列中值大于0的数量的需求,不用写一堆嵌套的CASE判断,有更简洁高效的实现方式:
方法1:使用IIF函数累加
SQL Server 2012及以上版本支持IIF函数,它可根据条件返回1或0,直接将这些结果相加就能得到计数:
SELECT P.January AS 'Jan', P.February AS 'Feb', P.March AS 'Mar', IIF(P.January > 0, 1, 0) + IIF(P.February > 0, 1, 0) + IIF(P.March > 0, 1, 0) AS 'Count' FROM 你的表名 P;
方法2:使用CASE表达式累加
如果是SQL Server 2012之前的版本,用CASE表达式同样能实现累加,逻辑和上述一致:
SELECT P.January AS 'Jan', P.February AS 'Feb', P.March AS 'Mar', CASE WHEN P.January > 0 THEN 1 ELSE 0 END + CASE WHEN P.February > 0 THEN 1 ELSE 0 END + CASE WHEN P.March > 0 THEN 1 ELSE 0 END AS 'Count' FROM 你的表名 P;
这两种方式的核心思路是:对每一列单独判断,满足条件(大于0)就返回1,否则返回0,最后将这些数值相加,得到的就是该行中符合条件的列的总数。相比你之前枚举所有组合的CASE写法,不仅代码简洁,扩展性也更强——后续新增月份列时,只需在累加部分多加一行判断即可,无需修改大量WHEN条件。
另外注意:你原代码里把Count的值写成了字符串(比如'3'),上面的方案返回的是数值类型,更符合计数逻辑;如果确实需要字符串类型,可使用CAST或CONVERT转换结果。
内容的提问来源于stack exchange,提问作者Mohan Wijesena
相关产品推荐
相关产品推荐

