Forums Neueste Beiträge
 

Top 3 gruppiert (SQL-Frage)

17/09/2010 - 20:53 von Christian Rohrbach | Report spam
Hallo zusammen,

ich verzweifele an einer SQL-Abfrage (Plattform SQL-Server 2000), welche
eigentlich einfach sein sollte.

Ich habe in einer Tabelle verkaufte Produkte. Vereinfacht sieht die Tabelle
folgendermaßen aus:

ProduktID
Verkàufernummer
Preis

ich möchte jeweils die 3 teuersten Produkte pro Verkàufer selektieren und
ausgeben.

Die Ausgabe soll so aussehen:

Verkàufer Preis ProduktID
1 120 Euro 1234
1 100 Euro 1235
1 90 Euro 1277
2 100 Euro 1235
2 90 Euro 1277
(kein dritter Eintrag zu 2, da dieser nur 2 Produkte verkauft hat)
3 180 Euro 1222
3 180 Euro 1222
3 90 Euro 1277

Falls das drittteuerste Produkt eines Verkàuferns = einem weiteren ist, so
sollen nur 3 Eintràge gezeigt werden.

Alternativ habe ich das Problem gelöst indem ich eine 4 Spalte (Hilfsspalte)
eingefügt habe und mittels Transact-sql die Daten in ein Recordset schreibe
und sortiert durchlaufe. Beim Durchlauf aktualisere ich in der Hilfsspalte
die Rangfolge, welche ich dann leicht Abfragen kann. Das ist aber nicht
schön, da ich tàglich die Hilfsspalte aktualsieren muß was bei der Größe der
Tabelle recht zeitraubend ist. Eigentlich müßte ich das sogar bei jedem
neuen Eintrag in der Tabelle machen...

Kann ich das auch ohne Hilfsspalte lösen (per Select)?

Vielen Dank

Gruß, Christian
 

Lesen sie die antworten

#1 Jörg Burzeja
17/09/2010 - 21:47 | Warnen spam
Am 17.09.2010 20:53, schrieb Christian Rohrbach:

ich verzweifele an einer SQL-Abfrage (Plattform SQL-Server 2000), welche
eigentlich einfach sein sollte.

Ich habe in einer Tabelle verkaufte Produkte. Vereinfacht sieht die Tabelle
folgendermaßen aus:

ProduktID
Verkàufernummer
Preis

ich möchte jeweils die 3 teuersten Produkte pro Verkàufer selektieren und
ausgeben.

Die Ausgabe soll so aussehen:

Verkàufer Preis ProduktID
1 120 Euro 1234
1 100 Euro 1235
1 90 Euro 1277
2 100 Euro 1235
2 90 Euro 1277
(kein dritter Eintrag zu 2, da dieser nur 2 Produkte verkauft hat)
3 180 Euro 1222
3 180 Euro 1222
3 90 Euro 1277

Falls das drittteuerste Produkt eines Verkàuferns = einem weiteren ist, so
sollen nur 3 Eintràge gezeigt werden.

Alternativ habe ich das Problem gelöst indem ich eine 4 Spalte (Hilfsspalte)
eingefügt habe und mittels Transact-sql die Daten in ein Recordset schreibe
und sortiert durchlaufe. Beim Durchlauf aktualisere ich in der Hilfsspalte
die Rangfolge, welche ich dann leicht Abfragen kann. Das ist aber nicht
schön, da ich tàglich die Hilfsspalte aktualsieren muß was bei der Größe der
Tabelle recht zeitraubend ist. Eigentlich müßte ich das sogar bei jedem
neuen Eintrag in der Tabelle machen...



Das geht auch ohne Hilfstabelle.


USE tempdb
GO

CREATE TABLE #temp (
Preis money,
Verkàufer smallint,
ProduktID smallint
)
GO

INSERT INTO #temp
SELECT 120.00, 1, 1234 UNION ALL
SELECT 90.00, 1, 1235 UNION ALL
SELECT 100.00, 1, 1277 UNION ALL
SELECT 320.00, 1, 1277 UNION ALL
SELECT 100.00, 2,1235 UNION ALL
SELECT 90.00, 2, 1277 UNION ALL
SELECT 180.00, 3, 1222 UNION ALL
SELECT 180.00, 3, 1222 UNION ALL
SELECT 90.00, 3, 1277


GO

SELECT * FROM #temp

SELECT t1.Verkàufer,
t1.Preis,
t1.ProduktID,
(SELECT Count(*)
FROM #temp t2
WHERE t2.Verkàufer = t1.Verkàufer
AND t2.Preis >= t1.Preis
) AS Position

FROM #temp t1

GROUP BY t1.Verkàufer,
t1.Preis,
t1.ProduktID

HAVING (SELECT Count(*)
FROM #temp t2
WHERE t2.Verkàufer = t1.Verkàufer
AND t2.Preis >= t1.Preis
) <= 3

ORDER BY Verkàufer, Preis DESC
GO

DROP TABLE #temp
GO




Viele Grüsse
Jörg

++ Where Do you want to go tomorrow? ++
++ http://schneegans.de/usenet/microsoft-umzug/ ++

Ähnliche fragen