Mehrere aggregierte Funktionen in einem SELECT abfragen

Aggregatfunktionen in SQL

In den meisten DBMS werden SQL Aggregatfunktionen zusammen mit der GROUP BY Funktion verwendet.

Beispiel einer Mehrfachaggregation mit COUNT

Geben sei eine Tabelle Produkte.

  • product_id
  • artNr
  • product_type_id
  • price

Über die Tabelle Produkte sollen verschieden Aggregatsfunktionen ausgeführt werden (Hier das zählen von Vorkommen). Eine Möglichkeit ist sicherlich die Ergebnisse in dedizierten Abfragen zu ermitteln. Dieses hat aber auch 4 Ergebniszeilen zur Folge.

---Anzahl der Produkte
SELELCT COUNT(*) FROM Produkte

---Anzahl der Produkt mit artNr > 1000
SELECT COUNT(*) FROM Produkte WHERE artNr > 1000

---Anzahl der Produkte die von Typ 3 sind
SELECT COUNT(*) FROM Produkte WHERE product_type_id = 3

---Anzahl der Produkte die von Typ 3 sind und eine ArtNr > 1000
SELECT COUNT(*) FROM Produkte WHERE product_type_id = 3 AND artNr > 1000

Diese einzelnen Abfragen sollen als Gesamtergebnis in einer Zeilen ausgeben werden!

10000 60 200 23

Wie kann man nun aber das in eine Abfrage verpacken? Dazu schauen wir uns die Definition der COUNT Anweisung an.

Es werden alle Zeilen gezählt in dem das Argument nicht NULL ist.

Es kann mit Hilfe der CASE-Anweisung können wir hieraus einzelne Prädikate/Vorbedingungen erstellen. p1 und p2.

SELECT
    CASE WHEN artNr > 1000        THEN 1 END p1,
    CASE WHEN product_type_id = 3 THEN 1 END p2
FROM products

Da kein ELSE Block angegeben ist, gibt CASE standardmäßig NULL zurück.

Das ganz Konstrukt sieht dann wie folgt aus:

SELECT count(*) AS cnt,
    count(p1) AS grt1000,
    count(p2) AS type3,
    count(p1+p2) AS combined FROM (
        SELECT
               CASE WHEN artNr > 1000 THEN 1 END p1,
               CASE WHEN product_type_id = 3 THEN 1 END p2
        FROM products)
products

Jetzt zählt count jede Reihe der Tabelle in denen die zuvor definierten Vorbedingungen gelten. Heraus kommt eine Ergebnisreihe. Da hier genau ein Full Table Scan erforderlich ist, kann dieses gerade bei größeren Tabellen auch zur Optimierung von Abfragen verwendet werden.