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.

13voto

Matthew Whited Punkte 21770

Sie können auch das Pivot-Schlüsselwort verwenden, wenn Sie SQL 2005 oder höher verwenden

mehr Infos und von Technet

SELECT *
FROM @Users
PIVOT (
    COUNT(Position)
    FOR Position
    IN (Manager, CEO, Employee)
) as p

Test Datensatz

DECLARE @Users TABLE (Position VARCHAR(10))
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('Manager')
INSERT INTO @Users (Position) VALUES('CEO')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')
INSERT INTO @Users (Position) VALUES('Employee')

7voto

Dana Punkte 30263

Meinen Sie nur dies:

SELECT Count(*) FROM YourTable WHERE Position = 'Manager'

Wenn ja, dann funktioniert das!

5voto

z00l Punkte 877

Ich weiß, das ist wirklich alt, aber ich mag die NULLIF Trick für solche Szenarien, und ich habe bisher keine Nachteile festgestellt. Sehen Sie sich einfach mein Copy&Paste-Beispiel an, das zwar nicht sehr praktisch ist, aber demonstriert, wie man es verwenden kann.

NULLIF könnte eine kleine negative Auswirkung auf die Leistung haben, aber ich denke, es sollte immer noch schneller sein als Unterabfragen.

DECLARE @tbl TABLE ( id [int] NOT NULL, field [varchar](50) NOT NULL)

INSERT INTO @tbl (id, field)
SELECT 1, 'Manager'
UNION SELECT 2, 'Manager'
UNION SELECT 3, 'Customer'
UNION SELECT 4, 'Boss'
UNION SELECT 5, 'Intern'
UNION SELECT 6, 'Customer'
UNION SELECT 7, 'Customer'
UNION SELECT 8, 'Wife'
UNION SELECT 9, 'Son'

SELECT * FROM @tbl

SELECT 
    COUNT(1) AS [total]
    ,COUNT(1) - COUNT(NULLIF([field], 'Manager')) AS [Managers]
    ,COUNT(NULLIF([field], 'Manager')) AS [NotManagers]
    ,(COUNT(1) - COUNT(NULLIF([field], 'Wife'))) + (COUNT(1) - COUNT(NULLIF([field], 'Son'))) AS [Family]
FROM @tbl

Kommentare erwünscht :-)

2voto

user3029478 Punkte 129

Ich habe Folgendes getan, um einen Datensatz zu erhalten, der sowohl die Gesamtzahl als auch die Anzahl, die die Kriterien erfüllen, innerhalb jedes Versandbehälters enthält. Damit konnte ich die Frage beantworten: "Wie viele Versandcontainer haben mehr als X % Artikel über Größe 51".

select
   Schedule,
   PackageNum,
   COUNT (UniqueID) as Total,
   SUM (
   case
      when
         Size > 51 
      then
         1 
      else
         0 
   end
) as NumOverSize 
from
   Inventory 
where
   customer like '%PEPSI%' 
group by
   Schedule, PackageNum

1voto

Thomas Decaux Punkte 19874

Beachten Sie, dass es mit PrestoDB SQL (von Facebook) eine Abkürzung gibt:

https://prestodb.io/docs/current/functions/aggregate.html

count_if(x) bigint

Gibt die Anzahl der TRUE-Eingabewerte zurück. Diese Funktion ist äquivalent zu count(CASE WHEN x THEN 1 END)

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