SQL: Ergebnismenge in einer Zeile darstellen

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



Das Prinzip ist einfach: Für jede Zeile, die von der unpivotisierten Abfrage zurückgegeben wird, wird ein CASE-Ausdruck (bzw. die IIf()-Funktion in Jet-SQL) verwendet, um die Zeilenwerte in Spalten darzustellen.


Es soll die Anzahl der Mitarbeiter jeder Abteilung nebeneinander angezeigt 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 sum( IIf( abt_nr = 10, 1, 0 ) ) AS abt_10,
       sum( IIf( abt_nr = 20, 1, 0 ) ) AS abt_20,
       sum( IIf( abt_nr = 30, 1, 0 ) ) AS abt_30
FROM   mitarbeiter

Lösung für andere SQL-Dialekte

SELECT SUM( CASE WHEN abt_nr = 10 THEN 1 ELSE 0 END ) AS abt_10,
       SUM( CASE WHEN abt_nr = 20 THEN 1 ELSE 0 END ) AS abt_20,
       SUM( CASE WHEN abt_nr = 30 THEN 1 ELSE 0 END ) AS abt_30
FROM   mitarbeiter

Lösung für PostgreSQL

In PostgreSQL lässt sich auch die crosstab()-Funktion des tablefunc-Moduls für den Zweck einsetzen.

SELECT abt_10,
       abt_20,
       abt_30
FROM   crosstab('
                 SELECT 1,
                        abt_nr,
                        count( * )
                 FROM   mitarbeiter
                 GROUP  BY 1, 2
                 ',
                 $$ VALUES ( 10 ),( 20 ),( 30 ) $$
                 ) AS ct ( r      INTEGER,
                           abt_10 INTEGER,
                           abt_20 INTEGER,
                           abt_30 INTEGER )

Dieser DBFiddle zeigt die Umsetzung für PostgreSQL.

abt_10 abt_20 abt_30
3 5 6



Zurück zur Übersicht