SQL: Ergebnismenge in mehreren Zeilen darstellen

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



In einer Unterabfrage können die darzustellenden Werte durchnummeriert werden, über die dann in der Hauptabfrage gruppiert wird. SQL-Dialekte, die Window-Funktionen unterstützen, können auf die Unterabfrage verzichten und stattdessen die row_number()-Funktion verwenden.


Es sollen z.B. die Mitarbeiter unter ihrer Job-Bezeichnung augelistet werden.

Lösung für Jet-SQL

Hinweis für Access-Anwender
Um die folgenden Abfragen selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein.

SELECT min( IIf( job = 'Hauptgeschäftsführer', ma_name ) ) AS hauptgeschaeftsfuehrer,
       min( IIf( job = 'Abteilungsleiter', ma_name ) ) AS abteilungsleiter,
       min( IIf( job = 'Sachbearbeiter', ma_name ) ) AS sachbearbeiter,
       min( IIf( job = 'Handelsvertreter', ma_name ) ) AS handelsvertreter,
       min( IIf( job = 'Referent', ma_name ) ) AS referent
FROM   ( SELECT job,
         ma_name,
         ( SELECT count(*)
           FROM   mitarbeiter AS m0
           WHERE  m0.job = m1.job AND
                  m0.ma_nr < m1.ma_nr ) AS num
         FROM mitarbeiter AS m1 ) AS m2
GROUP  BY m2.num

Lösung mittels Window Funktion row_number()

SELECT MIN( CASE WHEN job = 'Hauptgeschäftsführer' THEN ma_name ELSE NULL END ) AS hauptgeschaeftsfuehrer,
       MIN( CASE WHEN job = 'Abteilungsleiter' THEN ma_name ELSE NULL END ) AS abteilungsleiter,
       MIN( CASE WHEN job = 'Sachbearbeiter' THEN ma_name ELSE NULL END ) AS sachbearbeiter,
       MIN( CASE WHEN job = 'Handelsvertreter' THEN ma_name ELSE NULL END ) AS handelsvertreter,
       MIN( CASE WHEN job = 'Referent' THEN ma_name ELSE NULL END ) AS referent
FROM   ( SELECT job,
                ma_name,
                ROW_NUMBER() OVER ( PARTITION BY job ORDER BY ma_nr ) AS num
         FROM   mitarbeiter) AS m
GROUP BY num
ORDER BY num
hauptgeschaeftsfuehrer abteilungsleiter sachbearbeiter handelsvertreter referent
König Johann Schmidt Allard Scheidt
(Null) Blank Adam Wecker Fuhrmann
(Null) Kühne Jakobs Mertens (Null)
(Null) (Null) Müller Dreher (Null)



Zurück zur Übersicht