2012-03-30 112 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