MySQL - suche eine Art user defined Group by
HI!
hab hier eine MySQL-Tabelle mit folendem Aufbau:
Muss jetzt alle Zeilen bei denen die erste Spalte gleich ist, zusammen bearbeiten.
zB alle Zeilen mit 'C': über die Zweite Spalte den Durchschnitt bilden und alle Zeilen die >10% davon entfernt sind - weiter verarbeiten.
nur ein Beispiel
arbeite mit PHP, mysqli und fetch_assoc()
ein Array mit allen "C"-Zeilen wäre super - so eine Art user defined Group by - gibt es das bei MySQL?
konkret geht es um kompatible und inkompatible Jahresintervalle, die ich je nachdem kombinieren muss. falls das relevant ist.
sg Dirm
hab hier eine MySQL-Tabelle mit folendem Aufbau:
col1 | col2 |
A | 12 |
B | 12 |
B | 34 |
C | 11 |
C | 12 |
C | 23 |
D | 45 |
E | 67 |
E | 78 |
Muss jetzt alle Zeilen bei denen die erste Spalte gleich ist, zusammen bearbeiten.
zB alle Zeilen mit 'C': über die Zweite Spalte den Durchschnitt bilden und alle Zeilen die >10% davon entfernt sind - weiter verarbeiten.
nur ein Beispiel
arbeite mit PHP, mysqli und fetch_assoc()
ein Array mit allen "C"-Zeilen wäre super - so eine Art user defined Group by - gibt es das bei MySQL?
konkret geht es um kompatible und inkompatible Jahresintervalle, die ich je nachdem kombinieren muss. falls das relevant ist.
sg Dirm
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 190241
Url: https://administrator.de/forum/mysql-suche-eine-art-user-defined-group-by-190241.html
Ausgedruckt am: 13.04.2025 um 23:04 Uhr
5 Kommentare
Neuester Kommentar
... also nur so als Anmerkung würde ich die Spalte years in 2 Spalten splitten start_year und end_year.
Die Spalten könntest Du dann mit einem Update-Stament füllen.
Spielt der Wert in col2 keine Rolle beim Zusammenführen der Datensätze, oder wird da der kleinste oder der größe Wert genommen?
Ich denke das ganze kann man schon mit ein bisschen Überlegung per SQL-Update bzw. über den Umweg einer temporären Tabelle durchziehen. Die Frage ist natürlich wie groß die Tabelle ist und ob sich der Aufwand lohnt.
Gruß Jörg
Die Spalten könntest Du dann mit einem Update-Stament füllen.
Spielt der Wert in col2 keine Rolle beim Zusammenführen der Datensätze, oder wird da der kleinste oder der größe Wert genommen?
Ich denke das ganze kann man schon mit ein bisschen Überlegung per SQL-Update bzw. über den Umweg einer temporären Tabelle durchziehen. Die Frage ist natürlich wie groß die Tabelle ist und ob sich der Aufwand lohnt.
Gruß Jörg
... versuch mal folgendes
Musst Du eventuell noch auf MySQL-Dialekt anpassen. Grundlage hier Oracle.
Gruß Jörg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT a.col1,
MIN(a.col2) col2, -- oder was auch immer hier übernommen werden soll
a.konfig,
c.start_year||'-'||CASE WHEN c.end_year < EXTRACT(YEAR FROM SYSDATE) THEN c.end_year END years
FROM tabelle a
INNER JOIN (SELECT b.col1,
b.konfig,
MIN(SUBSTR(years,1,4)) start_year
MAX(SUBSTR(years,6,4)) end_year
FROM tabelle b
GROUP BY b.col1, b.konfig) c ON a.col1 = c.col1
AND a.konfig = c.konfig
GROUP BY a.col1, a.konfig,
c.start_year || '-' || CASE WHEN c.end_year < EXTRACT(YEAR FROM SYSDATE) THEN c.end_year END
Musst Du eventuell noch auf MySQL-Dialekt anpassen. Grundlage hier Oracle.
Gruß Jörg