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

如何筛选购买过商品64244但未购买过64270的客户?

正确SQL查询方案

错误原因分析

你之前的写法都是针对单条订单记录的判断,而需求是在客户维度筛选:客户存在至少一笔商品64244的订单,且该客户没有任何商品64270的订单。之前的逻辑未关联客户ID,无法跨订单判断客户的整体购买行为。


方案1:使用NOT EXISTS(推荐,性能更优)

通过关联客户ID,判断当前客户是否从未购买过64270:

-- 若需去重客户信息,保留DISTINCT;若需展示该客户所有64244的订单记录,移除DISTINCT
SELECT DISTINCT o.CustomerID, o.Name
FROM Orders o
WHERE o.ProductCode = '64244'
AND NOT EXISTS (
    SELECT 1
    FROM Orders o2
    WHERE o2.CustomerID = o.CustomerID
    AND o2.ProductCode = '64270'
)

如果需要展示该客户购买64244的具体日期,直接保留PurchaseDate即可(同一客户多次购买会返回多条记录):

SELECT o.CustomerID, o.Name, o.PurchaseDate
FROM Orders o
WHERE o.ProductCode = '64244'
AND NOT EXISTS (
    SELECT 1
    FROM Orders o2
    WHERE o2.CustomerID = o.CustomerID
    AND o2.ProductCode = '64270'
)

方案2:使用GROUP BY + HAVING

从客户分组角度,统计满足购买条件的客户:

SELECT CustomerID, Name
FROM Orders
GROUP BY CustomerID, Name
HAVING 
  -- 至少购买过一次64244
  SUM(CASE WHEN ProductCode = '64244' THEN 1 ELSE 0 END) > 0
  -- 从未购买过64270
  AND SUM(CASE WHEN ProductCode = '64270' THEN 1 ELSE 0 END) = 0

这种方式适合需要同时统计客户购买次数的场景。


方案3:使用LEFT JOIN排除法

通过左连接匹配客户的64270订单,筛选无匹配结果的客户:

SELECT DISTINCT o.CustomerID, o.Name
FROM Orders o
LEFT JOIN Orders o2 
  ON o.CustomerID = o2.CustomerID 
  AND o2.ProductCode = '64270'
WHERE o.ProductCode = '64244'
AND o2.CustomerID IS NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:22:17