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

求助:完善统计多条件客户订单的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;

关键说明

  1. 日期范围处理:用ADD_MONTHS代替直接加365天,避免闰年导致的日期计算误差,确保严格的12个月周期。
  2. 产品过滤:用IN简化多产品条件,比多个OR更简洁易读。
  3. 关联逻辑:使用JOIN而非LEFT JOIN,因为我们只需要存在后续有效订单的客户;如果要包含没有后续订单的客户,可改为LEFT JOIN,并通过COALESCE(COUNT(o2.order_id), 0)将空值转为0。
  4. 原SQL问题修正:
    • 删除了WHERE子句中无效的then '1'语法
    • 补充了日期条件的比较运算符(>=)
    • 新增了后续订单的日期范围和产品类型过滤
    • 添加了GROUP BY子句,确保聚合函数的正确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:03:21