588 Stimmen

Ist es möglich, eine Bedingung in Count() anzugeben?

Ist es möglich, eine Bedingung anzugeben in Count() ? Ich möchte nur die Zeilen zählen, die z. B. "Manager" in der Spalte Position enthalten.

Ich möchte dies in der Zählanweisung tun, nicht mit WHERE Ich frage danach, weil ich sowohl Manager als auch Andere in der gleichen Kategorie zählen muss. SELECT (etwas wie Count(Position = Manager), Count(Position = Other)) also WHERE ist für mich in diesem Beispiel nicht von Nutzen.

921voto

Guffa Punkte 663241

Wenn Sie die Abfrage selbst nicht einfach mit einer where Klausel, können Sie die Tatsache nutzen, dass die count Aggregat zählt nur die Nicht-Null-Werte:

select count(case Position when 'Manager' then 1 else null end)
from ...

Sie können auch die sum in ähnlicher Weise zu aggregieren:

select sum(case Position when 'Manager' then 1 else 0 end)
from ...

259voto

D'Arcy Rittich Punkte 159655

Angenommen, Sie wollen die zurückgegebenen Zeilen nicht einschränken, weil Sie auch andere Werte aggregieren, dann können Sie dies wie folgt tun:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...

Angenommen, Sie haben in derselben Spalte die Werte "Manager", "Supervisor" und "Teamleiter", dann könnten Sie die Anzahl der einzelnen Werte wie folgt ermitteln:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount,
    count(case when Position = 'Supervisor' then 1 else null end) as SupervisorCount,
    count(case when Position = 'Team Lead' then 1 else null end) as TeamLeadCount,
from ...

59voto

Hivenfour Punkte 541

@Guffa 's Antwort ist ausgezeichnet, nur darauf hinweisen, dass vielleicht ist sauberer mit einer IF-Anweisung

select count(IIF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...

45voto

AdaTheDev Punkte 135097

Es kommt darauf an, was Sie meinen, aber die andere Interpretation der Bedeutung ist, dass Sie Zeilen mit einem bestimmten Wert zählen wollen, aber nicht die SELECT zu JEDEM dieser Zeilen...

Sie würden es tun, indem Sie SUM() mit einer Klausel, etwa so, statt mit COUNT() : z.B.

SELECT SUM(CASE WHEN Position = 'Manager' THEN 1 ELSE 0 END) AS ManagerCount,
    SUM(CASE WHEN Position = 'CEO' THEN 1 ELSE 0 END) AS CEOCount
FROM SomeTable

28voto

samjewell Punkte 916

Wenn Sie Postgres oder SQLite verwenden, können Sie die Filterklausel verwenden, um die Lesbarkeit zu verbessern:

SELECT
  COUNT(1) FILTER (WHERE POSITION = 'Manager') AS ManagerCount,
  COUNT(1) FILTER (WHERE POSITION = 'Other') AS OtherCount
FROM ...

BigQuery hat auch Countif - Hier finden Sie die Unterstützung für diese Funktionen in den verschiedenen SQL-Dialekten: https://modern-sql.com/feature/filter

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X