2012-03-30 9 views
1

私は、次の返却開発しようとしているクエリ:クエリの問題2008

  1. CustomerID
  2. 製品の名前
  3. 各製品の販売台数の合計こと各製品の最大量に

を購入していますこれは私がこれまで持っているものです。

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

をお試しくださいを使用して。 mssql、oracle、mysql? – Arion

+0

@Arion SQL Server 2008. MSSQLと思われます –

+1

複数のお客様が同じMAXを購入した場合のためにTOP 1を追加することがあります –

答えて

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 

EDIT

、これを試してみては重複を返します。これは、順序、各製品の倍の最大数を持っている顧客IDのセミコロン区切りのリストを返します。これは、以下使用することによって回避することができます。

;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なしでソリューションを構築できますか? –

+0

これは完璧に機能しますが、クロスアプリケーションなしでソリューションを構築することは可能でしょうか?私のコードで使用した節のみを使用していますか?たぶんHAVINGを使用していますか? –