SQL für Top3 auf Monatsbasis

Hi!

Ich habe hier eine - vermeintlich - einfache Aufgabe, für die ich aber keine Lösung in SQL finde. Vielleicht kann mir jemand von euch einen Ansatz liefern, wie ich das in SQL gelöst bekomme. Also:

Ich habe eine Tabelle, die auf Monatsbasis je Mitarbeiter die abgewickelten Aufträge enthält. Ziel ist es, je Monat die drei Mitarbeiter mit den meisten Aufträgen zu ermitteln

Monat MaNr Anzahl
01 1 60
01 2 75
01 3 50
01 4 70
01 5 55
02 1 80
02 2 50
02 3 70
02 4 65
02 5 60
03 1 65
03 2 70
03 3 55
03 4 75
03 5 60

Als Ergebnis soll herauskommen:

Monat MaNr Anzahl
01 2 75
01 4 70
01 1 60

02 1 80
02 3 70
02 4 65

03 4 75
03 2 70
03 1 65

Es muss also ein „group by“ auf „Monat“ rein sowie ein „order by“ auf „Anzahl desc“ - aber wie sieht das SQL (für Oracle) dazu aus?

Danke für jede Hilfe

Heinrich

Moin,
leider kenn ich mich mit Oracle nicht aus, aber da die SQL-Varianten sich in vielen Punkten ähneln, hilft Dir vielleicht auch eine MySQL-Lösung:

SELECT tab1.Monat, tab1.MaNr, tab1.Anzahl
FROM heinrichs\_tab AS tab1
LEFT JOIN heinrichs\_tab AS tab2 
ON (tab1.Monat = tab2.Monat AND tab1.Anzahl 

Als Ergebnis krieg ich damit auch:

Monat MaNr Anzahl
1 2 75
1 4 70
1 1 60
2 1 80
2 3 70
2 4 65
3 4 75
3 2 70
3 1 65


Vielleicht hilft's ja.

Schönen Gruß,
Michael

Hallo,

Probier mal (nur für Oracle) :

select MONAT,ma,anzahl from (

SELECT MONAT, ma, anzahl,
RANK () OVER (PARTITION BY MONAT ORDER BY anzahl DESC) AS RANK
FROM TEST
GROUP BY MONAT, ma, anzahl)
where rank [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Puh, durch Ulrichs kurzer Oracle-Lösung und meiner umständlich langen MySQL-Version würde MySQL noch glatt in Verruf geraten. Drum hier noch schnell ne optimierte 2. Lösung:

SELECT * FROM test
WHERE (
SELECT COUNT(*) FROM test AS t
WHERE t.Monat = test.Monat AND t.Anzahl > test.Anzahl
)

sieht besser aus, ne? :smile:

Hi!

Hallo,

Probier mal (nur für Oracle) :

select MONAT,ma,anzahl from (

SELECT MONAT, ma, anzahl,
RANK () OVER (PARTITION BY MONAT ORDER BY anzahl
DESC) AS RANK
FROM TEST
GROUP BY MONAT, ma, anzahl)
where rank