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

SQL技术问询:获取2024年未订购指定区域的客户订单数据

解决未订购指定区域客户的营收汇总问题

第一步:筛选目标客户

要找出2024年初至今从未订购过指定地理区域的客户,有两种常用的高效写法:

方法1:使用NOT EXISTS

SELECT c.ClientID, c.ClientName
FROM Client c
WHERE NOT EXISTS (
    SELECT 1
    FROM `Order` o
    JOIN Zone z ON o.ZoneID = z.ZoneID
    WHERE o.ClientID = c.ClientID
      AND o.OrderDate >= '2024-01-01'
      AND z.ZoneName = '指定区域名称' -- 也可替换为ZoneID = 目标区域ID
)

方法2:使用LEFT JOIN + IS NULL

SELECT c.ClientID, c.ClientName
FROM Client c
LEFT JOIN `Order` o 
    ON o.ClientID = c.ClientID 
    AND o.OrderDate >= '2024-01-01'
LEFT JOIN Zone z ON o.ZoneID = z.ZoneID AND z.ZoneName = '指定区域名称'
WHERE o.OrderID IS NULL

第二步:关联数据并汇总营收

基于筛选出的客户,关联他们的所有2024年订单、订单行和对应区域,按客户、区域、月份分组计算营收:

SELECT
    c.ClientID,
    c.ClientName,
    z.ZoneName AS 已订购区域,
    DATE_FORMAT(o.OrderDate, '%Y-%m') AS 订单月份,
    SUM(ol.Quantity * ol.UnitPrice) AS 月度区域营收
FROM Client c
-- 先过滤未订购指定区域的客户
WHERE NOT EXISTS (
    SELECT 1
    FROM `Order` o_exclude
    JOIN Zone z_exclude ON o_exclude.ZoneID = z_exclude.ZoneID
    WHERE o_exclude.ClientID = c.ClientID
      AND o_exclude.OrderDate >= '2024-01-01'
      AND z_exclude.ZoneName = '指定区域名称' -- 替换为你的目标区域
)
-- 关联该客户的所有有效订单
JOIN `Order` o 
    ON c.ClientID = o.ClientID 
    AND o.OrderDate >= '2024-01-01'
JOIN OrderLine ol ON o.OrderID = ol.OrderID
JOIN Zone z ON o.ZoneID = z.ZoneID
-- 按维度分组汇总
GROUP BY c.ClientID, c.ClientName, z.ZoneName, DATE_FORMAT(o.OrderDate, '%Y-%m')
ORDER BY c.ClientID, 订单月份, z.ZoneName;

关键细节说明

  • Order是SQL关键字,必须用反引号(`)包裹表名,避免语法报错。
  • 营收计算默认用「订单行数量×单价」,若有折扣、税费等字段,需自行调整计算逻辑。
  • 用区域ID筛选比名称更高效,可将z.ZoneName = '指定区域名称'替换为z.ZoneID = 目标区域ID。
  • 若只需展示客户已订购的区域列表(不拆分月份),去掉订单月份字段,仅按客户和区域分组即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:04:55