关联查询中按字段分组可行吗?求多状态订单统计SQL改写方案
正确SQL写法及问题分析
正确实现语句
SELECT tc.UIDPK, COUNT(torder.status) AS total, SUM(CASE WHEN torder.status = 'IN_PROGRESS' THEN 1 ELSE 0 END) AS inprogress, COUNT(torder.status) - SUM(CASE WHEN torder.status = 'IN_PROGRESS' THEN 1 ELSE 0 END) AS remaining FROM TCUSTOMER tc INNER JOIN TORDER torder ON tc.UIDPK = torder.CUSTOMER_UID WHERE tc.UIDPK = 490000 GROUP BY tc.UIDPK;
原语句问题说明
你之前用左连接TORDER表的写法会导致重复统计:每个IN_PROGRESS状态的订单会和主连接的所有订单形成笛卡尔积,最终count(torder2.status)得到的数值远大于实际的IN_PROGRESS订单数,计算结果完全错误。
正确写法逻辑
直接通过条件聚合实现统计:
COUNT(torder.status)依然统计总订单数(INNER JOIN只会保留有订单的客户,和原逻辑一致)SUM(CASE WHEN ...)只对IN_PROGRESS状态的订单计数,精准匹配需求remaining直接用总订单数减去IN_PROGRESS的计数即可
如果你的数据库支持IF函数(比如MySQL),也可以简化成:
SELECT tc.UIDPK, COUNT(torder.status) AS total, SUM(IF(torder.status = 'IN_PROGRESS', 1, 0)) AS inprogress, COUNT(torder.status) - SUM(IF(torder.status = 'IN_PROGRESS', 1, 0)) AS remaining FROM TCUSTOMER tc INNER JOIN TORDER torder ON tc.UIDPK = torder.CUSTOMER_UID WHERE tc.UIDPK = 490000 GROUP BY tc.UIDPK;
内容的提问来源于stack exchange,提问作者user2555212
相关产品推荐
相关产品推荐

