2016-04-13 17 views
1

Ich habe es geschafft, diese AbfrageT-SQL: Partitionen auswählen, die mehr als 1 Zeile haben

SELECT 
    PartGrp,VendorPn, customer, sum(sales) as totalSales, 
    ROW_NUMBER() OVER (PARTITION BY partgrp, vendorpn ORDER BY SUM(sales) DESC) AS seqnum 
FROM 
    BG_Invoice 
GROUP BY 
    PartGrp, VendorPn, customer 
ORDER BY 
    PartGrp, VendorPn, totalSales DESC 

Um eine Ergebnismenge wie diese zu erhalten zu verwenden. Eine Liste der Verkaufsdatensätze, gruppiert nach einer Gruppe, einer Produkt-ID (VendorPn), einem Kunden, den Verkäufen des Kunden und einer Sequenznummer, die durch die Gruppe und die Produkt-ID partitioniert ist.

PartGrp  VendorPn  Customer totalSales seqnum 
------------------------------------------------------------ 
AGS-AS  002A0002-252 10021013 19307.00 1 
AGS-AS  002A0006-86  10021013 33092.00 1 
AGS-AS  010-63078-8  10020987 10866.00 1 
AGS-SQ  B71040-39  10020997  7174.00 1 
AGS-SQ  B71040-39  10020998  2.00 2 
AIRFRAME 0130-25   10017232  1971.00 1 
AIRFRAME 0130-25   10000122  1243.00 2 
AIRFRAME 0130-25   10008637  753.00 3 
HARDWARE MS28775-261  10005623  214.00 1 
M250  23066682  10013266  175.00 1 

Wie kann ich das Ergebnis filtern, um nur auf Zeilen zurück, die mehr als 1 seqnum haben? Ich würde das Ergebnis setzen möchte ähnliche

PartGrp  VendorPn  Customer totalSales seqnum 
------------------------------------------------------------ 
AGS-SQ  B71040-39  10020997 7174.00  1 
AGS-SQ  B71040-39  10020998  2.00  2 
AIRFRAME 0130-25   10017232 1971.00  1 
AIRFRAME 0130-25   10000122 1243.00  2 
AIRFRAME 0130-25   10008637  753.00  3 

Aus dem ersten Ergebnismenge Beispiel zu sehen, nur die Zeilen mit VendorPn „B71040-39“ und „0130-25“ hatte mehrere Kunden das Produkt kaufen. Alle Produkte, die nur einen Kunden hatten, wurden entfernt. Beachten Sie, dass meine gewünschte Ergebnismenge nicht einfach seqnum > 1 ist, weil ich immer noch die erste seqnum pro Partition brauche.

+0

sollte in der Lage sein, eine weitere äußere Abfrage Schicht und dann, um durch die alliiert t.seqnum. Du musst die innere Ordnung umlegen. – PCSgtL

Antwort

2

ich Ihre Frage so sein ändern würde:

SELECT PartGrp, 
     VendorPn, 
     customer, 
     sum(sales) as totalSales, 
     ROW_NUMBER() OVER (PARTITION BY partgrp,vendorpn ORDER BY SUM(sales) DESC) as seqnum, 
     COUNT(1) OVER (PARTITION BY partgrp,vendorpn) as cnt 
FROM BG_Invoice 
GROUP BY PartGrp,VendorPn, customer 
HAVING cnt > 1 
ORDER BY PartGrp,VendorPn, totalSales desc 
+0

Danke, das scheint zu sein, was ich suche, aber Sql-Server erlaubt mir nicht, die Alias-'cnt' in' HAVING' zu referenzieren. Sollte ich die Auswahl einfach mit einem anderen auswählen und 'where cnt> 1 'machen? –

+0

Ja, bitte. Ich habe nicht, wie man es prüft, da ich nicht Ihre Tabellenstruktur noch einen SQL Server zur Hand habe. –

0

können Sie versuchen, so etwas wie:

SELECT PartGrp,VendorPn, customer, sum(sales) as totalSales, 
ROW_NUMBER() OVER (PARTITION BY partgrp,vendorpn ORDER BY SUM(sales) DESC) as seqnum 
FROM BG_Invoice 
GROUP BY PartGrp,VendorPn, customer 
HAVING seqnum <> '1' 
ORDER BY PartGrp,VendorPn, totalSales desc 
0
WITH CTE AS (
    SELECT 
     PartGrp,VendorPn, customer, sum(sales) as totalSales, 
     ROW_NUMBER() OVER (PARTITION BY partgrp, vendorpn ORDER BY SUM(sales) DESC) AS seqnum 
    FROM 
     BG_Invoice 
    GROUP BY 
     PartGrp, VendorPn, customer) 
SELECT DISTINCT 
    a.* 
FROM 
    CTE a 
JOIN 
    CTE b 
     ON a.PartGrp = b.PartGrp 
     AND a.VendorPn = b.VendorPn 
WHERE 
    b.seqnum > 1 
ORDER BY 
    a.PartGrp, 
    a.VendorPn, 
    a.totalSales DESC; 
Verwandte Themen