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.