如何基于历史与当前表编写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
相关产品推荐
相关产品推荐

