Mysql Group By with Condition

Fuxi60

Benutzer
Beiträge
8
Nr1 Nr2 Nr3 Nr4 Nr5
158181 1100 6930 48276575 8
158181 1200 6880 48276575 8
158181 1200 6920 48276575 8

SELECT COUNT(*),SUM(Nr3),GROUP_CONCAT(Nr2 ORDER BY Nr2 ASC)
FROM tabelle
GROUP BY Nr1,Nr4,Nr5
Result:

3 20730 1100,1200,1200

Desired Result

2 13810 1100,1200
1 6920 1200

Explanation:

Hello,
As you can see in the example, I want to group with the condition that No.2 cannot be the same.
Thank you
 
Werbung:
Hello, as far as I know, this is a purely German forum.

But let's talk about your problem anyway.
The result is purely random because you are grouped,
but the “Order BY” order was not and cannot be specified
because there is no Column ID or date.

The order after a restore or delete and insert can be different


regards

Bernd
 
Hallo, danke für die Info.
Natürlich hat meine Tabelle einen Index und auch ein Datum.
Oben ist nur ein Beispiel für das eigentliche Problem.
Group By mit Bedingung ob Feld Nr 3 gleich oder nicht gleich ist.
Danke
 
Also du hast drei Zeilen und gruppierst nach Spalte 1, 4 und 5, die alle gleich sind. Dann wird daraus natürlich eine Zeile, das ist korrekt. Du möchtest jetzt zwei der Zeilen gruppieren und eine ausklammern, aber es gibt keinen Zusammenhang nach dem das erfolgen könnte. Es müsste mindestens eine weitere Zeile in die Gruppierung mit eingehen, die Zeilen 3 und 4 scheinen aber nicht in Frage zu kommen weil sie sich in allen Werten unterscheiden.

Dein Wunsch-Ergebnis basiert ja auf einem sinnvollen Zusammenhang von Zeile 1 und 2, nicht aber von Zeile 3. Worin besteht der?
 
Hallo ukulele, danke für deine Antwort.
Ja genau. Es müßte noch nach Nr2 gruppiert werden.
Aber eben mit einer Bedingung.
Bei ungleich Gruppieren und nicht bei Gleichheit.

Beispiel:
Group by case when Nr2 ungleich
Oder so ähnlich.
Ich weis nicht ob es so etwas gibt in sql.
Sonst muss ich das selber schreiben
Vielen Dank
 
Nunja das ist nicht eindeutig und ein ungefähr gibt es nicht. Mal angenommen "ungleiche" Datensätze ließen sich gezielt gruppieren, dann würde SQL zwei Gruppen bilden, einmal Zeile 1 und 2 und einmal Zeile 1 und 3, denn die sind ja auch ungleich. In der Ergebnismenge ist dann Zeile 1 zwei mal enthalten.

Um das auszuschließen müsste man die Daten in eine Reihenfolge bringen, hier mal ein Ansatz:
Code:
WITH t AS (
SELECT Nr1,Nr2,Nr3,Nr4,Nr5,
ROW_NUMBER() OVER (PARTITION BY Nr1,Nr4,Nr5,Nr2 ORDER BY Nr2) AS zeile
FROM tabelle
)
SELECT COUNT(*),SUM(Nr3),GROUP_CONCAT(Nr2 ORDER BY Nr2 ASC)
FROM t
GROUP BY Nr1,Nr4,Nr5,zeile
 
Hallo ukulete,
danke für die Antwort.
Da muss ich dir Recht geben.
Den Text verstehe ich noch nicht ganz.
Werde ich aber testen.
Danke
 
Hallo ukulete,
Nach den ersten Tests klappt das.
Da wäre ich so in Sql nicht drauf gekommen.
Du scheinst ja Profi zu sein ?
Danke nochmal
 
Mir liegt SQL und ich nutze es schon sehr lange, ich bin allerdings im Vergleich zu einigen anderen hier in keiner großen Datenbank-Umgebung unterwegs. Ich mag mehr die Logik-Rätsel und eigentlich gibt es fast immer einen Weg.
 
Hallo zusammen,

ich glaube nicht das das schöne Beispiel von @ukulele das richtige Ergebnis liefert, wie du dir das vorstellst.

Ich habe dazu einmal ein Beispiel angelegt, wo es nach einem Duplikat weitergeht. Da sieht man das die weiteren
Einträge wieder bei der vorherigen Gruppe zugefügt werden.

Hier noch ein Ansatz mit User Vars. Ist auch im Beispiel vorhanden.

Code:
SELECT SUM(1), GROUP_CONCAT(Nr2 ORDER BY Nr2 ASC) AS cc,max(Nr3),max(Nr4) FROM (
SELECT *
       , (IF(@last_nr2 = Nr2, @grp_nr:=@grp_nr+1, @grp_nr)) AS grp_nr
       , (@last_nr2 := Nr2) AS last_nr2
FROM deine_tabelle
CROSS JOIN ( SELECT @grp_nr:=1 , @last_nr2:='' ) AS Init
) as x
GROUP BY Nr1, grp_nr, Nr3, Nr4, Nr5 ;




Beispiel: dbfiddle

Gruß Bernd
 
Hallo Bernd,
ich habe mir dein Beispiel angeschaut und ich glaube, das die Lösung von ukelete doch perfekt ist?
Es sind alle Einträge groupiert die nicht gleich sind.
Bei dir sind 2 Reihen a 6 die doch eingentlich zusammen könnten , Oder ?
Danke
Gruß
Herbert
 
Werbung:
Zurück
Oben