SQL: Erstellen einer Liste mit Trennzeichen

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



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.



Zurück zur Übersicht