2012-03-30 110 views
1

我试图开发返回以下查询:查询问题在SQL Server 2008中

  1. 单元,每个单元产品销往
  2. 产品的名称
  3. CustomerID总量买了每个产品

此的最大数量是我到目前为止有:

SELECT DISTINCT 
    Products.ProductName, 
    SUM([Order Details].Quantity) as cant, 
    Orders.CustomerID  
FROM 
    Products 
INNER JOIN [Order Details] 
    ON Products.ProductID = [Order Details].ProductID 
INNER JOIN Orders 
    ON [Order Details].OrderID = Orders.OrderID 
WHERE 
    [Order Details].Quantity = 
    (
     SELECT 
     MAX([Order Details].Quantity) 
     FROM 
     [Order Details] 
     WHERE 
     [Order Details].ProductID = Products.ProductID 
) 
GROUP BY 
    Products.ProductName, Orders.CustomerID 

它没有给我预期的结果。

任何与表格或其他内容相关的信息,只需将它发布在评论中,我会回答。

在此先感谢您的帮助!

+1

你是什么:这可以通过使用下面的,它会返回一个分号客户ID的分隔列表,它有顺序的每个产品的最大次数来避免使用。 mssql,oracle,mysql? – Arion 2012-03-30 14:48:56

+0

@Arion SQL Server 2008.我相信MSSQL – 2012-03-30 14:50:33

+1

如果您有多个客户都购买了相同的MAX计数,您可能需要添加TOP 1 – 2012-03-30 14:58:49

回答

3

试试这个,

;WITH orderCTE AS 
( SELECT p.ProductName, 
      o.CustomerID, 
      SUM(od.Quantity) [Quantity] 
    FROM Products p 
      INNER JOIN [Order Details] od 
       ON od.ProductID = p.ProductID 
      INNER JOIN Orders o 
       ON o.OrderID = od.OrderID 
    GROUP BY p.ProductName, o.CustomerID 
) 
SELECT ProductName, [TotalQuantity], CustomerID 
FROM ( SELECT CustomerID, 
        ProductName, 
        Quantity, 
        MAX(Quantity) OVER(PARTITION BY ProductName) [MaxQuantity], 
        SUM(Quantity) OVER(PARTITION BY ProductName) [TotalQuantity] 
      FROM orderCTE 
     ) ord 
WHERE MaxQuantity = Quantity 

编辑

以上将返回副本如果不止一个客户有顺序的相同产品的最多数量。

;WITH orderCTE AS 
( SELECT p.ProductName, 
      o.CustomerID, 
      SUM(od.Quantity) [Quantity] 
    FROM Products p 
      INNER JOIN [Order Details] od 
       ON od.ProductID = p.ProductID 
      INNER JOIN Orders o 
       ON o.OrderID = od.OrderID 
    GROUP BY p.ProductName, o.CustomerID 
), MaxOrdersCTE AS 
( SELECT CustomerID, 
      ProductName, 
      Quantity, 
      MAX(Quantity) OVER(PARTITION BY ProductName) [MaxQuantity], 
      SUM(Quantity) OVER(PARTITION BY ProductName) [TotalQuantity] 
    FROM orderCTE 
) 

SELECT ProductName, 
     [TotalQuantity], 
     STUFF((SELECT ';' + CONVERT(VARCHAR, CustomerID) 
      FROM MaxOrdersCTE c 
      WHERE ord.ProductName = c.Productname 
      AND  MaxQuantity = Quantity 
      FOR XML PATH('') 
     ), 1, 1, '') [CustomerIDs] 
FROM MaxOrdersCTE ord 
WHERE MaxQuantity = Quantity 
1

试试这个

SELECT DISTINCT 
    p.ProductName, 
    SUM(od.Quantity) as cant, 
    o.CustomerID  
FROM 
    Products p 
    INNER JOIN [Order Details] od 
    ON p.ProductID = od.ProductID 
    CROSS APPLY (
     SELECT 
     MAX(Quantity) Quantity 
     FROM 
     [Order Details] 
     WHERE 
     ProductID = p.ProductID 
    ) mq 
    INNER JOIN [Order Details] fod 
    ON od.ProductID = fod.ProductID 
    AND mq.Quantity = fod.Quantity 
    INNER JOIN Orders o 
    ON fod.OrderID = o.OrderID 
GROUP BY 
    p.ProductName, o.CustomerID 
+0

您可以在没有CROSS的情况下构建解决方案吗? – 2012-03-30 15:59:34

+0

它完美的工作,但它可以建立一个没有CROSS APPLY的解决方案?仅使用我在代码中使用的子句?也许使用HAVING? – 2012-03-30 16:34:43