2012-03-30 7 views
1

Die Abfrage Ich versuche, die folgende Entwicklung zurück:Abfrage Problem in SQL Server 2008

  1. Die Gesamtmenge der Einheiten jedes Produkt
  2. Der Name des
  3. Das CustomerID Produkt verkauft, dass hat den maximalen Betrag für jedes Produkt gekauft

das ist, was ich bisher habe:

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 

Es gibt mir nicht die erwarteten Ergebnisse.

Alle Informationen in Bezug auf den Inhalt der Tabellen oder etwas anderes, einfach in einem Kommentar posten und ich werde antworten.

Vielen Dank im Voraus für die Hilfe!

+1

Was Sie sind verwenden. mssql, oracle, mysql? – Arion

+0

@ Arion SQL Server 2008. Ich glaube MSSQL –

+1

Sie möchten vielleicht eine TOP 1 hinzufügen, wenn Sie mehrere Kunden haben, die beide die gleiche MAX-Anzahl gekauft haben –

Antwort

3

die Sie interessieren,

;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

Die oben Duplikate zurück, wenn mehr als ein Kunde die maximale Höhe der Zeit das gleiche Produkt hat bestellen. Dies kann durch Verwendung der unten vermieden werden, was ein Semikolon getrennte Liste von Kunden-IDs zurück, die um jedes Produkt die maximale Anzahl, wie oft haben:

;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

Versuchen Sie, diese

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

Können Sie eine Lösung ohne das CROSS erstellen? –

+0

Es funktioniert perfekt, aber es wäre möglich, eine Lösung ohne CROSS APPLY zu erstellen? Nur die Klauseln verwenden, die ich in meinem Code verwendet habe? Vielleicht mit HAVING? –