Excels Countif in SQL


Die Microsoft-Excel-Funktion Countif zählt die Zellen, für die eine Bedingung erfüllt ist:

Excel: =COUNTIF(<Quelle>, <Bedingung>)

In der Abfragesprache SQL kann man dieses Verhalten durch die Verwendung eines Case-Ausdrucks in der Count-Funktion erreichen:

  SQL: COUNT(CASE WHEN <Bedingung> THEN 1 END)

Während man bei Excel in der <Quelle> beliebige Zellen auswählt – im folgenden Beispiel Ax:Ay – , erfolgt bei SQL die Auswahl der Zeilen und Spalten getrennt. Die Zeilen werden durch die Group-By- und Over-Klauseln festgelegt. Die Spalte muss in der <Bedingung> im Case-Ausdruck explizit verwendet werden.

Excel: =COUNTIF(Ax:Ay, 42)
  SQL: COUNT(CASE WHEN A = 42 THEN 1 END)

Die Bedingung wird dabei nicht unter Anführungszeichen gesetzt, auch nicht wenn andere Vergleiche verwendet werden:

Excel: =COUNTIF(Ax:Ay, "> 42")
  SQL: COUNT(CASE WHEN A > 42 THEN 1 END)

Texte müssen in SQL unter einfache Hochkomma gesetzt werden0:

Excel: =COUNTIF(Ax:Ay, "Marvin")
  SQL: COUNT(CASE WHEN A = 'Marvin' THEN 1 END)

Ob ein Textvergleich die Groß- und Kleinschreibung unterscheidet oder nicht hängt von der sogenannten Collation ab. Hier unterscheiden sich auch die Voreinstellungen: MySQL, MariaDB und SQL Server unterscheiden mit den Voreinstellungen nicht zwischen Groß- und Kleinbuchstaben. Bei PostgreSQL, der Oracle Datenbank und SQLite wird standardmäßig zwischen Groß- und Kleinbuchstaben unterschieden.

Anders als die Excel-Funktion Countif wendet SQL bei Textvergleichen mit dem Ist-gleich-Zeichen (=) keine Wildcard-Zeichen an. Um in SQL Wildcard-Zeichen zu verwenden, kann man den Like-Operator verwenden. Dabei dient der Unterstrich (_) als Platzhalter für ein Zeichen und das Prozentzeichen (%) als Platzhalter für beliebig viele Zeichen – entsprechend ? und * bei Excel Countif.

Excel: =COUNTIF(Ax:Ay, "Marvin*")
  SQL: COUNT(CASE WHEN A LIKE 'Marvin%' THEN 1 END)

Countif über mehrere Spalten wird in SQL durch die Summe einer Count-Funktion pro Spalte umgesetzt:

Excel: =COUNTIF(Ax:Cy, 42)
  SQL: COUNT(CASE WHEN A = 42 THEN 1 END) +
       COUNT(CASE WHEN B = 42 THEN 1 END) +
       COUNT(CASE WHEN C = 42 THEN 1 END)

Die Funktion Countifs kann oft durch eine And-Bedingung im Case-Ausdruck umgesetzt werden.

Excel: =COUNTIFS(Ax:Ay, 42, Bx:By, 43)
  SQL: COUNT(CASE WHEN A = 42 AND B = 43 THEN 1 END)

Die Funktion Counta wird in SQL ebenfalls mit einem Case-Ausdruck umgesetzt. SQL unterscheidet dabei zwischen Leerstrings und dem Null-Wert. Jene Zeilen zu zählen, die weder den Null-Wert noch den Leerstring enthalten, kann man folgenden Ausdruck verwenden:

SQL: COUNT(CASE WHEN A IS NOT NULL AND A != '' THEN 1 END)

Beachte, dass man in SQL das Ist-gleich-Zeichen nicht nutzen kann, um auf den Null-Wert zu prüfen – dafür braucht man is [not] null.

Mehr über die Funktionsweise und weitere Möglichkeiten:

Über den Autor

Foto von Markus Winand

Markus Winand ist der SQL Renaissance Botschafter auf der Mission, Entwickler auf die Evolution von SQL im 21. Jahrhundert aufmerksam zu machen. 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. Je nach Konfiguration verwenden manche Datenbanken stattdessen Anführungszeichen (MySQL, MariaDB).

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„modern SQL“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO | CC-BY-NC-ND 3.0 Lizenz