SQL查询CASE条件统计结果一致错误排查与别名计算咨询
问题根因分析
- 核心错误为统计函数误用:
COUNT()函数会统计所有非NULL值,你在CASE语句中返回的1和0都是非空值,因此count(NDS)和count(Home_Care_CHSP)实际统计的都是子查询的总记录数,自然数值完全相同,和CASE的THEN 1 ELSE 0逻辑本身无关。 - 次要错误为分类匹配值不精准:你CASE语句
IN子句中写的分类值和实际appoint_types表的样例分类不符(比如实际分类为National- Physio -HCP,你写的是National-HCP,缺少空格和中间描述),会导致符合Home_Care_CHSP条件的记录被误判。 - 冗余问题:子查询中的
GROUP BY没有必要,可以直接在外层做条件聚合简化查询。
修正方案
统计逻辑有两种可选修改方式:
- 将
COUNT()替换为SUM(),直接累加符合条件的1的数量,0不会影响统计结果 - 保留
COUNT(),将CASE语句的ELSE 0改为ELSE NULL,这样不符合条件的记录返回NULL不会被计数
优化后的完整SQL如下:
SELECT COALESCE(b.label, 'total') AS Clinic, SUM(CASE WHEN at.name LIKE '%initial%' AND at.category IN ('National- ND', 'National -ND') THEN 1 ELSE 0 END) AS count_NDS, SUM(CASE WHEN at.name LIKE '%initial%' AND at.category IN ('National- Ex Phys- Zest', 'National- OT -HCP', 'National- Physio -HCP', 'National- Speech Pathology- HCP') THEN 1 ELSE 0 END) AS count_Home_Care, SUM(i.net_amount) AS Revenue, SUM(i.net_amount) / NULLIF(SUM(CASE WHEN at.name LIKE '%initial%' AND at.category IN ('National- ND', 'National -ND') THEN 1 ELSE 0 END), 0) AS Revenue_NDS, SUM(i.net_amount) / NULLIF(SUM(CASE WHEN at.name LIKE '%initial%' AND at.category IN ('National- Ex Phys- Zest', 'National- OT -HCP', 'National- Physio -HCP', 'National- Speech Pathology- HCP') THEN 1 ELSE 0 END), 0) AS Revenue_Home_Care FROM indiv_appoint ia INNER JOIN appoint_types at ON at.id = ia.appoint_type_id INNER JOIN invoices i ON i.appoint_id = ia.id INNER JOIN businesses b ON b.id = ia.busines_id GROUP BY ROLLUP(b.label);
注:代码中加入NULLIF()是为了避免某类预约数量为0时出现除以0的报错。
针对你提出的是否可以仅用一个CASE语句生成别名用于后续计算的问题:不可以,你需要统计两个独立维度的预约数量,两个计算逻辑互相独立,必须分别用两个CASE语句做聚合,无法合并为单个CASE生成两类统计值。
内容的提问来源于stack exchange,提问作者ryan
相关产品推荐
相关产品推荐

