MySQL中Group By如何将多个不同状态值合并为一类进行Count统计
解决方案
核心通过CASE表达式对状态字段做自定义映射,将两个待合并的状态归为同一类后分组统计即可,修改后的代码如下:
SELECT CASE WHEN UR.status IN ('Pending', 'Sent For Approval') THEN '待审批' -- 可替换为你需要的分类名,如英文的'Pending & Approval' ELSE UR.status END AS status_type, COUNT(UR.UnitRateID) AS total FROM UnitRate UR INNER JOIN Telecom TC ON UR.UnitOwnerID = TC.UnitOwnerID WHERE UR.status IN ('Pending','Sent For Approval','Approved','Rejected') AND UR.WaterPeriodFrom = '".$MeterDateFrom."' AND UR.WaterPeriodTo = '".$MeterDateTo."' AND TC.TelPeriodFrom = '".$MeterDateFrom."' AND TC.TelPeriodTo = '".$MeterDateTo."' GROUP BY status_type ORDER BY FIELD(status_type, '待审批', 'Rejected', 'Approved') ASC
逻辑说明
- 映射规则:
Pending和Sent For Approval统一归为同一类,Approved、Rejected保持原有单独统计逻辑,Reset状态不在过滤范围内自动排除,完全匹配需求 - 排序逻辑做了对应调整,保证合并后的待审批分类排在最前,后续状态顺序和原有要求一致
- 优化掉了原写法中效率较低的相关子查询,直接关联后分组统计,查询性能更高
注意:原代码直接拼接
$MeterDateFrom、$MeterDateTo参数存在SQL注入风险,建议改为预编译参数绑定的方式传参。
内容的提问来源于stack exchange,提问作者Ethic Or Logics
相关产品推荐
相关产品推荐

