Filter

Selektive Aggregate


Die Filter-Klausel erweitert Aggregatfunktionen (Sum, Avg, Count, …) um eine zusätzlichen Where-Klausel. Das Ergebnis der Aggregatfunktion wird nur aus den Zeilen gebildet, die auch diese zusätzlich Where-Klausel erfüllen.

Syntax

Die Filter-Klausel wird Aggregatfunktionen nachgestellt:

SUM(<Ausdruck>) FILTER(WHERE <Bedingung>)

Mit Ausnahme von Unterabfragen, Window-Funktionen und äußeren Referenzen0 ist in der <Bedingung> der Filter-Klausel alles erlaubt, das auch in einer normalen Where-Klausel erlaubt ist.

Die Filter-Klausel ist auf alle Aggregatfunktionen anwendbar: neben den altbekannten wie Sum und Count also auch auf Array_agg und sortierte Mengenfunktionen wie Listagg.

Wenn eine Aggregatfunktion als Window-Funktion (Over-Klausel) genutzt werden, ist die syntaktische Reihenfolge: Aggregatfunktion, Filter-Klausel, Over-Klausel:

SUM(...) FILTER(WHERE ...) OVER (...)

Die Filter-Klausel ist jedoch nicht generell vor Over erlaubt: Filter ist nur nach Aggregatfunktionen erlaubt, nicht aber nach anderen Window-Funktionen wie zum Beispiel Rangfunktionen (Rank, Dense_rank, …).

Anwendungsfälle

Die folgenden Artikel beschreiben häufige Anwendungen von Filter:

Kompatibilität

Die Filter-Klausel wurde mit SQL:2003 als Teil der optionalen Funktion „Advanced OLAP operations“ (T612) eingeführt. Sie wird heute kaum unterstützt, kann aber leicht mit einem Case-Ausdruck emuliert werden (siehe Konforme Alternativen).

BigQuery 2025-11-03Db2 (LUW) 12.1.2DuckDB 1.4.0MariaDB 12.1.2MySQL 9.5.0Oracle DB 23.26.0PostgreSQL 18SQL Server 2022SQLite 3.51.0Filter-KlauselEmulation mit Case

Konforme Alternativen

Die Filter-Klausel kann generell durch einen Case-Ausdruck in der Aggregatfunktion umgesetzt werden. Dazu wird die Filterbedingung in die When-Klausel, der zu aggregierende Wert in die Then-Klausel übernommen. Da Aggregatfunktionen Null generell nicht berücksichtigen1, genügt die implizite Else Null-Klausel, um nicht passende Zeilen zu ignorieren. Die folgenden Ausdrücke sind daher gleichwertig.

SUM(<Ausdruck>) FILTER(WHERE <Bedingung>)
SUM(CASE WHEN <Bedingung> THEN <Ausdruck> END)

Lediglich Count(*) ist noch als Spezialfall zu nennen, da man „*“ nicht direkt in die Then-Klausel schreiben kann. Es genügt jedoch, den Stern durch einen Nicht-Null-Konstante zu ersetzen. Damit ist sichergestellt, dass jede passende Zeile gezählt wird. Für die nicht passenden Zeilen liefert der implizite Else Null-Zweig Null, was auch von Count ignoriert wird.

COUNT(*) FILTER (WHERE <Bedingung>)
COUNT(CASE WHEN <Bedingung> THEN 1 END)

Falls ein set quantifier (Distinct oder All) verwendet wird, muss dieser in der Aggregatfunktion vor Case erhalten bleiben.

Wenn du diese Seite magst, magst du vielleicht auch …

… meine Newsletter bestellen, gratis Sticker erhalten, mein Buch kaufen oder an einer Schulung teilnehmen.

Proprietäre Erweiterungen

Unterabfragen Erlaubt (PostgreSQL)

Die PostgreSQL-Datenbank unterstützt die Verwendung von Unterabfragen in der Filter-Klausel (z. B. mittels Exists).

Proprietäre Alternativen

Da die oben beschriebene Standard-Alternative mit einem Case-Ausdruck weitestgehend unterstützt wird, rate ich von der Verwendung dieser proprietären Alternativen generell ab.

BigQuery 2025-11-03Db2 (LUW) 12.1.2DuckDB 1.4.0MariaDB 12.1.2MySQL 9.5.0Oracle DB 23.26.0PostgreSQL 18SQL Server 2022SQLite 3.51.0Countif

Countif (Google BigQuery)

Google BigQuery bietet die Aggregatfunktion Countif an, die vor allem aus Microsoft Excel bekannt ist.

COUNTIF(<Bedingung>) [OVER(…)]

Dasselbe Ergebnis kann man mit der Case-Alternative erreichen, die dann ein allen gängigen Datenbanken funktioniert:

COUNT(CASE WHEN <Bedingung> THEN 1 END) [OVER(…)]

20 Jahre SQL-Evolution kann man nicht an einem Tag nachholen. Abonniere den Newsletter via E-Mail, Bluesky oder RSS, um sukzessive aufzuholen und modern-sql.com am Radar zu behalten.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Fußnoten

  1. ISO/IEC 9075-2:2023 §10.9 SR 8.

    Beim der Emulation mit Case werden lediglich Window-Funktionen ausgeschlossen: ISO/IEC 9075-2:2023 §10.9 SR 7a.

  2. ISO/IEC 9075-2:2023 §10.9 GR 7a, 8a, 10d. Siehe auch ISO/IEC 9075-2:2023 §4.18.4.

    Ausnahme: Array_agg (ISO/IEC 9075-2:2023 §10.9 GR 12gii (NOTE 528)) – Bei dem Array-Konstruktor mittels Abfrage kann man Null-Werte auch ohne Filter-Klausel entfernen.

Neuigkeiten Abonnieren

Markus Winands MailinglistenMarkus Winands RSS-FeedMarkus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf TwitterMarkus Winand auf Bluesky
Copyright 2015-2025 Markus Winand. Alle Rechte vorbehalten.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO