SQL: Erstellen einer Liste mit Trennzeichen
In einer Liste sollen Tabellenzeilen als Werte zurückgegeben werden, die eventuell durch Kommata getrennt sind.
Viele SQL-Dialekte bieten dazu eine eigene Implementierung einer Aggregat-Funktion an. In SQLite3 und MySQL heißt sie group_concat(), PostgreSQL verwendet string_agg(). Eine Listendarstellung kann auch mit Window-Funktionen gebildet werden. Access bietet leider diese Funktionalität nicht an. Ersatzweise bieten sich Löungen wie z. B. Liste per SQL aufbauen an. Ist jedoch die maximale Anzahl der Listenelemente bekannt, kann man auch in Access zu einer reinen SQL-Lösung greifen.
Hinweis für Access-Anwender
Um die folgende Abfrage selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein.
Die folgende Abfrage listet die Mitarbeiter kommasepariert nach Abteilungsnummer auf:
SELECT abt_nr, LEFT( ma2, InStrRev( ma2, ', ' ) - 1 ) AS abt_ma FROM ( SELECT abt_nr, Max( IIf( num = 1, ma0 ) ) & Max( IIf( num = 2, ma0 ) ) & Max( IIf( num = 3, ma0 ) ) & Max( IIf( num = 4, ma0 ) ) & Max( IIf( num = 5, ma0 ) ) & Max( IIf( num = 6, ma0 ) ) AS ma2 FROM ( SELECT m0.abt_nr, ma_name & ', ' AS ma0, cnt, ( SELECT Count( * ) FROM mitarbeiter AS m1 WHERE m0.abt_nr = m1.abt_nr AND m0.ma_nr >= m1.ma_nr ) AS num FROM mitarbeiter AS m0, ( SELECT abt_nr, Count( * ) AS cnt FROM mitarbeiter GROUP BY abt_nr ) AS m3 WHERE m3.abt_nr = m0.abt_nr ) AS m2 GROUP BY abt_nr ) AS m4
abt_nr | abt_ma |
10 | Kühne, König, Müller |
20 | Schmidt, Johann, Scheidt, Adam, Fuhrmann |
30 | Allard, Wecker, Mertens, Blank, Dreher, Jakobs |
In SQLite3 fällt die Lösung so aus:
SELECT abt_nr, group_concat(ma_name, ', ') AS abt_ma FROM mitarbeiter GROUP BY abt_nr
Hier ist ein entsprechender DBFiddle.