MySQL子查询COUNT结果异常:主查询关联后数值不符求助
问题解决步骤
1. 修正子查询的COUNT统计逻辑
你的子查询中count(odl.number IN ('APAC'))用法错误:IN返回布尔值(true/false),而COUNT会统计所有非NULL值,不管结果是true还是false,无法得到符合条件的行数。
替换为以下两种写法之一:
COUNT(CASE WHEN odl.number = 'APAC' THEN 1 END):仅当条件满足时返回1,否则返回NULL,COUNT会忽略NULL值,只统计符合条件的行数。SUM(CASE WHEN odl.number = 'APAC' THEN 1 ELSE 0 END):满足条件加1,否则加0,直接求和得到符合条件的数量。
2. 给子查询添加GROUP BY子句
单独执行子查询时,你没有按订单分组,导致返回的是整个数据集的聚合结果,而非每个订单的单独统计。必须添加GROUP BY od.id, od.number,让子查询为每个订单计算对应的APAC数量。
修正后的子查询:
SELECT od.id, od.number, COUNT(CASE WHEN odl.number = 'APAC' THEN 1 END) AS "APAC" FROM order_data od LEFT JOIN order_data_line odl ON odl.id_no = od.id GROUP BY od.id, od.number
3. 移除主查询的多余GROUP BY
主查询中的GROUP BY od.number会导致同一number的行被合并,累加q.APAC的值。由于子查询已经按订单id分组,关联后每个主查询行对应子查询的一行,无需额外分组。
最终完整SQL:
SELECT od.number, q.APAC FROM order_data od LEFT JOIN ( SELECT od.id, od.number, COUNT(CASE WHEN odl.number = 'APAC' THEN 1 END) AS "APAC" FROM order_data od LEFT JOIN order_data_line odl ON odl.id_no = od.id GROUP BY od.id, od.number ) q ON q.id = od.id
执行后就能得到你期望的结果:
od.number q.APAC 123 3
内容的提问来源于stack exchange,提问作者Wind
相关产品推荐
相关产品推荐

