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

关联查询中按字段分组可行吗?求多状态订单统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:10