SQL查询问题:如何筛选过去12个月未产生订单的客户?
解决方案
方法1:使用LEFT JOIN筛选无匹配订单
从客户表出发,左连接过去12个月的订单记录,筛选出没有对应订单的客户:
SELECT c.Customer_ID, c.Loginname FROM Mouser_Com.dbo.Customer c LEFT JOIN [Mouser_UVDATA].[dbo].[SalesOrder_Header] so ON c.Customer_Id = so.Customer_Id AND so.OrderDate >= DATEADD(YEAR, -1, GETDATE()) AND so.OrderDate < DATEADD(day, 1, GETDATE()) WHERE so.Customer_ID IS NULL
方法2:使用NOT EXISTS子查询
直接检查客户在过去12个月内无任何订单记录:
SELECT c.Customer_ID, c.Loginname FROM Mouser_Com.dbo.Customer c WHERE NOT EXISTS ( SELECT 1 FROM [Mouser_UVDATA].[dbo].[SalesOrder_Header] so WHERE so.Customer_Id = c.Customer_Id AND so.OrderDate >= DATEADD(YEAR, -1, GETDATE()) AND so.OrderDate < DATEADD(day, 1, GETDATE()) )
原查询问题说明
你原查询用INNER JOIN只会保留两边有匹配的记录,再加上WHERE条件筛选过去12个月的订单,导致无这段时间订单的客户根本不会进入结果集,因此HAVING COUNT(*) = 0无法返回数据。
两种方案中,NOT EXISTS通常性能更优,因为它找到第一个匹配记录就会停止检索,适合大数据量场景。
内容的提问来源于stack exchange,提问作者Tania Marinova
相关产品推荐
相关产品推荐

