Benötige Hilfe bei einer Abfrage

MysterioJN

SQL-Guru
Beiträge
158
Hallo zusammen,

ich stehe auf dem Schlauch.

Basistabellenauszug:
Jahr, Monat, Artikel, Stück
2019, 11, A, 125
2019, 11, A, 20
2019, 11, A, 5
2019, 10, A, 30
2019, 10, A, 25


Wichtig:
Oben in der Beispielliste steht nur - der Einfachheit halber - Einzelverkäufe des Artikel A drin.
Sprich es sind 3 x der Artikel A im Monat 11 abgeflossen = Summe Stück 150 (125 + 20 +5)
Weitere andere Artikel (B, C, etc.) sind hier nicht beigefügt - in echt aber schon.


Folgendes Ziel soll sein:
Ich brauche für den aktuellen Monat / Jahr [ WHERE Monat = MONTH(getdate()) AND Jahr = YEAR(getdate()) ] die besten 5 VERSCHIEDENEN Artikel nach SUMMIERTEN Stück des AKTUELLEN Monats.

Ich bekomm das irgendwie nicht hin:
- Zum einen muss ich auf den Artikel gruppieren
- dann nach Sum(Stück) DESC sortieren und mir nur die höchsten monatsweise summierten Stückzahlen anzeigen. Sprich: " A / 150" ohne die Stück der Vormonate.

Ich renne von einem Abfragefehler in den anderen. Ist mein Gedankengang falsch?

 
Werbung:
Code:
SELECT TOP 5 t.* FROM ( SELECT Jahr,Monat,Artikel,sum(Stück) AS Stück FROM tabelle WHERE Jahr = year(getdate()) AND Monat = month(getdate()) GROUP BY Jahr,Monat,Artikel ) t ORDER BY t.Stück DESC
Wäre jetzt eine Möglichkeit und vermutlich die "klassische" Variante weil kaum Besonderheiten im SQL.
 
mal ohne dem Datumszeugs:

Code:
test=*# SELECT * FROM mysterio ;
 artikel | stueck
---------+--------
 A       |     10
 A       |     20
 A       |     30
 B       |     10
 B       |     20
 C       |    100
 D       |      1
 D       |      1
 E       |    500
 E       |    100
(10 rows)
test=*# select artikel, sum(stueck) from mysterio group by artikel;
 artikel | sum
---------+-----
 B       |  30
 C       | 100
 D       |   2
 E       | 600
 A       |  60
(5 rows)

test=*# with summen as (select artikel, sum(stueck) from mysterio group by artikel) select artikel, sum, rank() over (order by sum desc) from summen;
 artikel | sum | rank
---------+-----+------
 E       | 600 |    1
 C       | 100 |    2
 A       |  60 |    3
 B       |  30 |    4
 D       |   2 |    5
(5 rows)
test=*# with summen as (select artikel, sum(stueck) from mysterio group by artikel), rank as ( select artikel, sum, rank() over (order by sum desc) from summen) select * from rank where rank <= 3;
 artikel | sum | rank
---------+-----+------
 E       | 600 |    1
 C       | 100 |    2
 A       |  60 |    3
(3 rows)
 
Werbung:
Zurück
Oben