2016-07-12 8 views
1

ich ein Szenario, wo die folgende Abfrage:SQL - Getting TOP Wert pro Attribut in Ergebnisse gesetzt

SELECT 
Purchasing.Supplier, 
PurchasingParts.Part, 
PurchasingParts.Description, 
PurchasingParts.CostPerUnit, 
PurchasingParts.PurchaseOrderNum, 
PurchasingParts.ItemNum 
FROM PurchasingParts 
INNER JOIN Purchasing ON PurchasingParts.PurchaseOrderNum = Purchasing.PurchaseOrderNum 
WHERE Supplier = 'Sup1' 
ORDER BY PurchasingParts.PurchaseOrderNum DESC 

folgende Ergebnisse Returns:

Supplier Part Description CostPerUnit PurchaseOrderNum ItemNum 
Sup1  cm-14b NULL  9.99  37163    1 
Sup1  cm-13 jkljlkjlk 9.99  37160    1 
Sup1  cm-13 jkljlkjlk NULL  37158    1 

Allerdings würde ich dann filtern möchte, dass Ergebnismenge, so dass nur die letzte Bestellung (dh mit der Höchsten Kaufbestellnummer) PER TEIL (nur für das Attribut Teil) angezeigt wird. Also in diesem Fall würden die endgültigen Ergebnisse sein:

Supplier Part Description CostPerUnit PurchaseOrderNum ItemNum 
Sup1  cm-14b NULL  9.99  37163    1 
Sup1  cm-13 jkljlkjlk 9.99  37160    1 

ich SQL Server 2008 bin mit

+0

Innerhalb 'PurchasingParts' Tabelle, haben Sie eine ID-Spalte oder vielleicht das Datum der Bestellung? –

+0

Die ID für die PurchasingParts-Tabelle ist ein zusammengesetzter Schlüssel von PurchaseOrderNum & ItemNum –

+0

Was ist mit Datum der Bestellung? Hast du das Feld dort? –

Antwort

2

Sie ROW_NUMBER() verwenden können:

SELECT t.* FROM (
    SELECT 
     Purchasing.Supplier, 
     PurchasingParts.Part, 
     PurchasingParts.Description, 
     PurchasingParts.CostPerUnit, 
     PurchasingParts.PurchaseOrderNum, 
     PurchasingParts.ItemNum, 
     ROW_NUMBER() OVER(PARTITION BY PurchasingParts.Part ORDER BY PurchasingParts.PurchaseOrderNum DESC) as rnk 
    FROM PurchasingParts 
    INNER JOIN Purchasing ON PurchasingParts.PurchaseOrderNum = Purchasing.PurchaseOrderNum 
    WHERE Supplier = 'Sup1' 
    ) t 
WHERE t.rnk = 1 
ORDER BY t.PurchaseOrderNum DESC 
+0

'NULL's wo? – sagi

+0

Das funktioniert aber nur, wenn ich die ORDER BY-Zeile herausnehmen: "Die ORDER BY-Klausel ist in Sichten, Inline-Funktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken ungültig, außer TOP, OFFSET oder FOR XML wird ebenfalls angegeben." Ich verwende SQL Server 2014 –

+0

Ja, Sie haben Recht, aktualisiert. @ John Berggqvist – sagi