You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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没有必要,可以直接在外层做条件聚合简化查询。
修正方案

统计逻辑有两种可选修改方式:

  1. 将COUNT()替换为SUM(),直接累加符合条件的1的数量,0不会影响统计结果
  2. 保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:24:03