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

SQL查询求助:合并多结果为单计数,统计特定销售订单数量

问题分析与解决方案

你的查询核心问题在于没有对每个订单的符合状态(1或0)进行求和,反而用了GROUP BY s.sales_person来分组,导致只返回了代理机构下的单个分组结果;即使去掉GROUP BY,也只是返回每个订单的单独状态值,没有汇总成你需要的总数。

另外,原查询的子查询写法效率不高,它属于相关子查询,会对每个sales行单独执行一次子查询,数据量大时性能会很差。

正确的查询思路

我们需要统计的是同时满足以下条件的销售订单总数:

  • 归属代理机构ID=8
  • 创建时间在2018-01-01至2018-01-08之间
  • 关联的订单商品中存在product_type='1'的条目
  • 每个订单仅统计一次(即使包含多个同类型商品)

方案一:使用JOIN和DISTINCT计数(直观高效)

这种方式通过直接关联筛选出符合条件的订单,再去重计数,逻辑清晰且性能友好:

SELECT COUNT(DISTINCT s.id) AS total_qualified_orders
FROM sales AS s
JOIN agency AS a ON s.sales_person = a.agency_id
JOIN sales_order_items AS si ON s.id = si.sale_id
WHERE 
    s.created >= '2018-01-01 00:00:00' 
    AND s.created <= '2018-01-08 23:59:59' 
    AND a.agency_id = '8'
    AND si.product_type = '1';

通过JOIN直接关联到符合条件的商品条目,COUNT(DISTINCT s.id)确保每个订单只被统计一次,完美解决了同一订单多个同类型商品的重复计数问题。

方案二:使用SUM和CASE表达式(保留状态判断逻辑)

如果你想保留原查询中“判断每个订单是否符合条件”的逻辑,再汇总总数,可以用SUM累加1和0:

SELECT SUM(CASE 
             WHEN EXISTS (
                 SELECT 1 FROM sales_order_items AS si 
                 WHERE si.sale_id = s.id AND si.product_type = '1'
             ) THEN 1 
             ELSE 0 
           END) AS total_qualified_orders
FROM sales AS s
JOIN agency AS a ON s.sales_person = a.agency_id
WHERE 
    s.created >= '2018-01-01 00:00:00' 
    AND s.created <= '2018-01-08 23:59:59' 
    AND a.agency_id = '8';

这里用EXISTS子查询判断当前订单是否有符合条件的商品(只要找到匹配就停止,比COUNT更高效),返回1或0后用SUM累加得到总数。

原查询的具体问题

  • 子查询(SELECT COUNT(DISTINCT(sale_id)) ...)对每个sales行返回的是该订单是否符合条件的状态(1或0),但你没有对这些值做求和操作,只是返回了每行的单独结果;
  • 加上GROUP BY s.sales_person后,因为所有订单都属于同一个代理机构(agency_id=8),所以只会返回一行,值为该分组下某一个订单的状态(比如1),而非所有符合条件订单的总数。

内容的提问来源于stack exchange,提问作者Keith Ivison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:23