2012-04-03 5 views
0

Ich möchte den höchsten Korb in meiner Datenmenge berechnen, aber ich kann nicht verstehen, wie ich es machen soll.SQL bringt die höchste Zeilensumme zurück

Ich habe Daten wie:

OrderID | CustomerID | BasketID | ProductID | Price 

1 | 1 | 1 | 221 | 10 
2 | 1 | 1 | 431 | 123 
3 | 1 | 2 | 761 | 44 
4 | 2 | 3 | 12 | 54 
5 | 2 | 3 | 102 | 78 
6 | 3 | 4 | 111 | 98 
7 | 3 | 4 | 41 | 45 
8 | 3 | 5 | 65 | 66 
9 | 4 | 6 | 32 | 47 
10 | 4 | 6 | 118 | 544 

Sorry, wenn es ziemlich chaotisch zu sein scheint.

Aber ich kann leicht die Summe mit einer offensichtlichen

SELECT SUM([Price]), BasketID, CustomerID FROM table 
GROUP BY BasketID, CustomerID 

bekommen Aber wie kann ich die Liste nur für den höchsten Preis Basket-ID für diese CustomerID

Dank

+2

** Was ** Datenbanksystem und welche Version? ** SQL ** ist nur die Structured Query Language - eine Sprache, die von vielen Datenbanksystemen verwendet wird - SQL ist ** NOT ** ein Datenbankprodukt ... solche Sachen sind sehr oft herstellerspezifisch - also müssen wir wirklich was wissen Datenbanksystem, das Sie verwenden .... –

+0

Ich benutze SQL Server 2008 R2, sorry darüber, muss vergessen, es in die Frage –

Antwort

0
SELECT * 
FROM (SELECT *, 
       DENSE_RANK() OVER (PARTITION BY CustomerID ORDER BY BasketTotal DESC) AS RNK 
     FROM (SELECT Sum(Price) AS BasketTotal, 
         BasketID, 
         CustomerID 
       FROM Order a 
       GROUP BY BasketID, 
          CustomerID 
         ) a 

     ) b 
     WHERE RNK = 1 

Ich schaffte es, etwas heraufzubeschwören, das funktionierte.

1

Sie filtern verwenden ein CTE (Common Table Expression) mit der ROW_NUMBER Funktion:

;WITH HighestPricePerCustomerAndBasket AS 
(
    SELECT 
     ID, UserID, ClassID, SchoolID, Created, 
     ROW_NUMBER() OVER(PARTITION BY BasketID,CustomerID ORDER BY Price DESC) AS 'RowNum' 
    FROM dbo.YourTable 
) 
SELECT 
    [Price], BasketID, CustomerID 
FROM HighestPricePerCustomerAndBasket 
WHERE RowNum = 1 

Dieser CTE "partitioniert" Ihre Daten durch BasketID,CustomerID, und für jede Partition gibt die ROW_NUMBER Funktion fortlaufende Nummern aus, beginnend bei 1 und geordnet nach Price DESC - so erhält die erste Zeile (höchster Preis) RowNum = 1 (für jede BasketID,CustomerID "Partition") was ich aus dem CTE in der SELECT-Anweisung danach auswähle.

+0

setzen Sorry, das hat nicht funktioniert –

Verwandte Themen