it-swarm.com.de

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

Kann in Count() eine Bedingung angegeben werden? Ich möchte nur die Zeilen zählen, die zum Beispiel "Manager" in der Spalte Position haben.

Ich möchte es in der count-Anweisung tun, ohne WHERE zu verwenden. Ich frage danach, weil ich sowohl Manager als auch Andere im selben SELECT zählen muss (so etwas wie Count(Position = Manager), Count(Position = Other)), also ist WHERE für mich in diesem Beispiel nicht von Nutzen.

350
agnieszka

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

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

Sie können das Aggregat sum auch auf ähnliche Weise verwenden:

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

Angenommen, Sie möchten die zurückgegebenen Zeilen nicht einschränken, da Sie auch andere Werte aggregieren, können Sie dies folgendermaßen tun:

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

Angenommen, in derselben Spalte, in der Sie die Werte Manager, Supervisor und Team Lead hatten, können 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 ...
200
RedFilter

Die Antwort von @Guffa ist ausgezeichnet. Weisen Sie einfach darauf hin, dass es mit einer IF-Anweisung möglicherweise sauberer ist

select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...
25
Hivenfour

Kommt darauf an, was du meinst, aber die andere Interpretation der Bedeutung ist, wo du Zeilen mit einem bestimmten Wert zählen willst, aber das SELECT nicht auf NUR diese Zeilen beschränken willst ...

Sie würden es mit SUM() mit einer Klausel in wie folgt tun, anstatt COUNT() zu verwenden: z.

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
20
AdaTheDev

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

mehr Info und von Technet

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

Testdatensatz

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')
12
Matthew Whited

Ich weiß, dass dies wirklich alt ist, aber ich mag den Trick NULLIF für solche Szenarien, und ich habe bisher keine Nachteile festgestellt. Schauen Sie sich einfach mein copy & pasteable-Beispiel an, das zwar nicht sehr praktisch ist, aber zeigt, wie man es verwendet.

NULLIF kann sich geringfügig negativ auf die Leistung auswirken, sollte aber dennoch schneller als Unterabfragen sein.

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 :-)

3
z00l

Meinst du genau das:

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

Wenn ja, dann ja, das funktioniert!

2
Dana
SELECT COUNT(*) FROM bla WHERE Position = 'Manager'
0
Peter

Ich denke, Sie können eine einfache WHERE-Klausel verwenden, um nur die Anzahl einiger Datensätze auszuwählen.

0
NawaMan

Hier ist, was ich getan habe, um einen Datensatz zu erhalten, der sowohl die Gesamtsumme als auch die Anzahl, die die Kriterien erfüllten, in jedem Versandbehälter enthielt. Damit kann ich die Frage "Wie viele Versandbehälter haben mehr als X% Artikel über Größe 51" beantworten.

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
0
user3029478

Beachten Sie bei PrestoDB SQL (von Facebook), dass es eine Verknüpfung gibt:

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

count_if (x) → bigint

Liefert die Anzahl der TRUE-Eingangswerte. Diese Funktion entspricht count (CASE WHEN x THEN 1 END)

0
Thomas Decaux