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

如何基于历史与当前表编写Microsoft SQL Server查询获取客户当前服务最新订单日期

SQL Server 查询:获取当前服务客户的最新订单日期及当月下单次数

没问题,我来帮你搞定这个查询需求。先理清楚核心逻辑:我们需要先筛选出当前仍在服务的客户,再合并历史与当月的订单数据,最终找出每个客户的最新订单月份,并统计该月份的下单次数。

完整查询语句

WITH CurrentCustomers AS (
    -- 第一步:确定所有当前服务的客户
    SELECT DISTINCT cust_id
    FROM T1
    WHERE status <> 'na' -- 排除T1中已取消服务的客户
    UNION
    SELECT DISTINCT cust_id
    FROM T2 -- 包含当月所有客户(T2是201706数据,代表当前服务)
),
AllValidOrders AS (
    -- 第二步:合并历史与当月的有效订单数据
    SELECT cust_id, order_date
    FROM T1
    WHERE cust_id IN (SELECT cust_id FROM CurrentCustomers)
      AND status <> 'na' -- 仅保留T1中未取消客户的订单
    UNION ALL
    SELECT cust_id, order_date
    FROM T2
    WHERE cust_id IN (SELECT cust_id FROM CurrentCustomers)
),
CustomerLatestMonth AS (
    -- 第三步:找出每个客户的最新订单月份
    SELECT cust_id, MAX(order_date) AS latest_order_month
    FROM AllValidOrders
    GROUP BY cust_id
)
-- 第四步:统计每个客户在最新订单月份的下单次数
SELECT 
    clm.cust_id AS 客户名称,
    clm.latest_order_month AS 最新订单月份,
    COUNT(avo.order_date) AS 当月下单次数
FROM CustomerLatestMonth clm
JOIN AllValidOrders avo 
  ON clm.cust_id = avo.cust_id 
  AND avo.order_date = clm.latest_order_month
GROUP BY clm.cust_id, clm.latest_order_month
ORDER BY clm.cust_id;

关键细节说明

  • 当前服务客户的判定:用UNION合并T1未取消客户和T2所有客户,自动去重,确保不会漏掉任何当前服务的客户。
  • 订单数据合并:用UNION ALL而非UNION,因为不需要去重订单(我们要统计次数,重复订单是真实下单记录)。
  • 日期格式适配:如果你的order_date是datetime类型(不是直接的YYYYMM格式),可以把查询中的order_date替换为CONVERT(VARCHAR(6), order_date, 112),这样会将日期转换为'201706'这种字符串格式,完美适配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:45:16