如何筛选购买过商品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
相关产品推荐
相关产品推荐

