求助:完善统计多条件客户订单的Count SQL查询语句
解决方案
先修正你原SQL里的语法错误和逻辑漏洞,以下是满足需求的两种实现方式:
方式一:按客户统计后续订单总数
如果只需要每个符合条件的客户,在初始订单后12个月内的有效订单次数:
WITH initial_orders AS ( -- 筛选2020年1月1日后购买mirror或bike的订单 SELECT customer_id, order_date AS initial_order_date FROM Orders WHERE product IN ('mirror', 'bike') AND order_date >= TO_DATE('1 Jan 2020', 'DD MON YYYY') ) SELECT io.customer_id, COUNT(o.order_id) AS follow_up_order_count FROM initial_orders io -- 关联后续符合条件的订单 JOIN Orders o ON io.customer_id = o.customer_id -- 订单日期在初始订单之后且不超过12个月 AND o.order_date > io.initial_order_date AND o.order_date <= ADD_MONTHS(io.initial_order_date, 12) -- 购买的是book或sofa AND o.product IN ('book', 'sofa') GROUP BY io.customer_id;
方式二:按初始订单统计对应后续订单数
如果需要保留每个初始订单的信息,统计该订单之后12个月内的有效订单次数:
SELECT o1.customer_id, o1.product AS initial_product, o1.order_date AS initial_order_date, COUNT(o2.order_id) AS follow_up_order_count FROM Orders o1 JOIN Orders o2 ON o1.customer_id = o2.customer_id AND o2.order_date > o1.order_date AND o2.order_date <= ADD_MONTHS(o1.order_date, 12) AND o2.product IN ('book', 'sofa') WHERE o1.product IN ('mirror', 'bike') AND o1.order_date >= TO_DATE('1 Jan 2020', 'DD MON YYYY') GROUP BY o1.customer_id, o1.product, o1.order_date;
关键说明
- 日期范围处理:用
ADD_MONTHS代替直接加365天,避免闰年导致的日期计算误差,确保严格的12个月周期。 - 产品过滤:用
IN简化多产品条件,比多个OR更简洁易读。 - 关联逻辑:使用
JOIN而非LEFT JOIN,因为我们只需要存在后续有效订单的客户;如果要包含没有后续订单的客户,可改为LEFT JOIN,并通过COALESCE(COUNT(o2.order_id), 0)将空值转为0。 - 原SQL问题修正:
- 删除了WHERE子句中无效的
then '1'语法 - 补充了日期条件的比较运算符(
>=) - 新增了后续订单的日期范围和产品类型过滤
- 添加了
GROUP BY子句,确保聚合函数的正确性
- 删除了WHERE子句中无效的
内容的提问来源于stack exchange,提问作者Lital
相关产品推荐
相关产品推荐

