首页 > 解决方案 > SQL 子查询:显示购买了两件商品的 Customer_ID

问题描述

编辑:

谢谢大家。链接这两个表的应该是 CustomerID,而不是 productID。即便如此,由于 Squirrel 所说,查询没有返回任何客户 ID。这是一个糟糕的查询。我发现使用以下语法获得了更好的成功:

SELECT distinct(c.customerID)
FROM sales.customer c inner join sales.SalesOrderHeader h
on c.CustomerID = h.CustomerID
inner join sales.SalesOrderDetail l on h.SalesOrderID = l.SalesOrderID
WHERE l.ProductID IN (710, 715)
GROUP BY c.customerID
HAVING COUNT(DISTINCT l.ProductID) = 2

我正在尝试从第二个表的列中返回CustomerID购买了具有特定ProductIDs(710 和 715)的两件商品的 s - 但尚未购买 716 的 s 。ProductID我正在尝试将其作为子查询执行,但出现错误

SQL 错误 [207] [S0001]:列名“ProductID”无效

这是我的代码块:

SELECT 
    sc.customerID
FROM
    sales.customer sc
WHERE 
    ProductID IN (SELECT ProductID 
                  FROM sales.SalesOrderDetail sod 
                  WHERE sod.ProductID = 710)
    AND ProductID IN (SELECT ProductID 
                      FROM sales.SalesOrderDetail sod 
                      WHERE sod.ProductID = 715)
    AND ProductID IN (SELECT ProductID 
                      FROM sales.SalesOrderDetail sod 
                      WHERE sod.ProductID != 716)

任何修复语法错误的帮助将不胜感激。谢谢!

标签: sqlsql-serversubquery

解决方案


好的,但是在将来,最好提供一些数据样本,列来理解这一点。您没有显示任何销售订单如何连接到销售订单详细信息。话虽如此,我将对您拥有的内容进行有根据的猜测。

我会做一次查询并获得每个合格产品的计数......然后申请HAVING。一个人可能有多个订单,并且每个产品都可能在不同的订单上(除非您关心的都在同一个订单上,这会略有不同)。

select
      SO.CustomerID
      -- at THIS point, I only care did the person have any of the products
      max( case when SOD.ProductID = 710 then 1 else 0 end ) as HasProduct1,
      max( case when SOD.ProductID = 715 then 1 else 0 end ) as HasProduct2,
      max( case when SOD.ProductID = 716 then 1 else 0 end ) as HasProduct3
   from
      Sales.SalesOrder SO
         JOIN Sales.SalesOrderDetail SOD
            on SO.SalesOrderID = SOD.SalesOrderID
   group by
      SO.CustomerID
   having 
       -- NOW, we can apply the product 1 & 2 purchased, but NOT product 3
          max( case when SOD.ProductID = 710 then 1 else 0 end ) = 1
      AND max( case when SOD.ProductID = 715 then 1 else 0 end ) = 1
      AND max( case when SOD.ProductID = 716 then 1 else 0 end ) = 0

如果您删除 HAVING 子句,您将能够看到所有客户以及他们是否有任何组合,例如只有产品 1 和 3、只有 2 或任何组合,包括没有订购任何相关产品的客户。


推荐阅读