Gruppierung und nur das Maximum aus geben

nixfix

Benutzer
Beiträge
10
Hallo Forumsgemeinde,

jetzt such ich schon seit 3 Stunden herum und komm einfach nicht weiter.

Ich habe eine Tabelle (kundensystem) in der die Daten ungefähr so drinnen stehen.

kunde| system | menge
Kunde1 | Syst_1 | 10
Kunde1 | Syst_1 | 20
Kunde1 | Syst_2 | 15
Kunde2 | Syst_1 | 10
Kunde2| Syst_2 | 25
Kunde3 | Syst_1 | 10
Kunde3 | Syst_1 | 12
Kunde3 | Syst_2 | 10
Kunde3 | Syst_2 | 15
Kunde3 | Syst_2 | 20


Ich möchte nun die Daten so ausgeben, dass je Kunde und System gruppiert und nur das System mit der höchsten Menge innerhalb der Gruppierung angezeigt wird. Also Ergebnis sollte dann so aussehen, wobei die Menge nicht unbedingt erforderlich ist.

kunde| system | menge
Kunde1 | Syst_1 | 30
Kunde2 | Syst_2 | 25
Kunde3 | Syst_2 | 45

Für euch wahrscheinlich ein Klacks :) aber ich seh den Wald vor lauter Bäumen schon nicht mehr.

Danke recht herzlich für eure Hilfe.

mfg
nixfix
 
Werbung:
Hallo akretschmer,

das ist ja mein Problem, dass ich da eben nicht hinkomme aber es gerne würde. Vielleicht nochmal anhand Kunde 1 erklärt

kunde| system | menge
Kunde1 | Syst_1 | 10
Kunde1 | Syst_1 | 20
Kunde1 | Syst_2 | 15

Also
select kunde, system, sum(menge) from kundensystem group by kunde, system order by kunde, sum(menge) desc

würde ja folgendes ergeben

kunde| system | menge
Kunde1 | Syst_1 | 30
Kunde1 | Syst_2 | 15

Somit hätte ich ja mal das System mit der höchsten Menge an erster Stelle stehen. Und genau das würde ich jetzt gerne ausgeben oder filtern sodass am Ende nur mehr das stehen bleibt. Das brauch ich nämlich dann als Verknüpfung zu einer anderen Tabelle und da darf es nur 1 Eintrag je Kunde geben.

kunde| system | menge
Kunde1 | Syst_1 | 30

Oder ich hab an deiner Frage jetzt was falsch verstanden?

mfg

nixfix
 
Ich glaube was du suchst ist besser mit ROW_NUMBER() umzusetzen:
Code:
SELECT kunde,system,menge
FROM (

SELECT ROW_NUMBER() OVER (PARTITION BY kunde ORDER BY system,menge DESC) AS zeile,
kunde,system,menge
FROM tabelle

)
WHERE zeile = 1
So hast du über die Sortierung am meisten Einfluss welches System wann gewählt wird.
 
von sum() war erst keine Rede ...

Code:
test=*# select * from nixfix ;
 kunde | system | menge
-------+--------+-------
     1 |      1 |    10
     1 |      1 |    20
     1 |      2 |    15
     2 |      1 |    10
     2 |      2 |    25
     3 |      1 |    10
     3 |      1 |    12
     3 |      2 |    10
     3 |      2 |    15
     3 |      2 |    20
(10 Zeilen)

test=*# with tmp as (select kunde, system, sum(menge) as summe, row_number() over (partition by kunde order by sum(menge)) from nixfix group by kunde, system order by kunde, system) select kunde, system, summe, row_number from tmp where row_number = 1;
 kunde | system | summe | row_number
-------+--------+-------+------------
     1 |      2 |    15 |          1
     2 |      1 |    10 |          1
     3 |      1 |    22 |          1
(3 Zeilen)

test=*#

PostgreSQL, aber Standard-SQL. Könnte MSSQL auch können.
 
Hallo ukulele & akretschmer,

erstmal danke für eure raschen Antworten.

@ukulele

Dein sql statement hat fast funktioniert.

SELECT kunde,system,menge
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY kunde ORDER BY system,sum(menge) DESC) AS zeile,
kunde,system,sum(menge)
FROM tabelle
)
WHERE zeile = 1

Das innerhalb der Klammer funktioniert. Hab nur die menge auf sum(menge) geändert.

Bekomm aber sonst leider die Fehlermeldung
Incorrect syntax near the keyword 'WHERE'.


@akretschmer
sorry das ich das mit sum nicht erwähnt habe.

Hab dein sql statement genommen. Da bekomme ich eine Fehlermeldung mit der ich gar nichts anfangen kann.

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.


Hoffe ihr könnt mir da nochmal weiterhelfen.

mfg
nixfix
 
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

Nun ja, nicht alle Datenbanken können so leistungsfähig wie PostgreSQL sein ;-)

Ähm, ich kann da jetzt nur bedingt helfen, habe nur PG hier.
 
Ja sry hatte das auf die schnelle geschrieben, fehlt der Tabellenalias hinter der Klammer und vor dem WHERE.
Code:
SELECT t.kunde,t.system,t.menge
FROM (

SELECT ROW_NUMBER() OVER (PARTITION BY kunde ORDER BY system,menge DESC) AS zeile,
kunde,system,menge
FROM tabelle

) t
WHERE t.zeile = 1
Das mit dem sum() kannst du so aber nicht machen. Ich finde allerdings auch das verfälscht die Daten wenn da eine Summe steht die sich aber gar nicht nur auf das System bezeiht das angezeigt wird. Daher würde ich das dann so vielleicht doch nicht machen.
 
Ich bin verwirrt aber das hier könnte sein was du suchst:
Code:
SELECT t.kunde,t.[system],t.menge
FROM (

SELECT ROW_NUMBER() OVER (PARTITION BY kunde ORDER BY [system],sum(menge) DESC) AS zeile,
kunde,[system],sum(menge) AS menge
FROM tabelle
GROUP BY kunde,[system]

) t
WHERE t.zeile = 1
 
Werbung:
Hallo Ukulele,

herzlichen Dank, genau das wars. Hatte deinen letzten Kommentar noch gar nicht gelesen. Hab den code mit der Gruppierung dank eurer Unterstützung jetzt auch selbst hinbekommen und was soll ich sagen - es funktioniert :) Aber ohne eure Hilfe hätt ich das sicher nicht geschafft.

Code:
SELECT t.kunde, substring(t.system, 1, 3) as system, t.menge
FROM (

SELECT ROW_NUMBER() OVER (PARTITION BY kunde ORDER BY substring(system, 1, 3), sum(menge) DESC) AS zeile,
kunde, substring(system, 1, 3) as system, sum(menge) as menge
FROM tabelle
group by kunde, substring(system, 1, 3)

) t
WHERE t.zeile = 1


mfg
nixfix
 
Zurück
Oben