Is het mogelijk om een voorwaarde op te geven in Count()?

Is het mogelijk om een voorwaarde op te geven in Count()? Ik wil alleen de rijen tellen die bijvoorbeeld “Manager” in de kolom Positie hebben.

Ik wil het doen in het count statement, niet met where; Ik vraag ernaar omdat ik zowel Managers als Overige in dezelfde SELECTmoet tellen (zoiets als Count(Position = Manager), Count(Position = Other))dus whereheb ik in dit voorbeeld niet aan.


Antwoord 1, autoriteit 100%

Als je de query zelf niet kunt beperken met een where-clausule, kun je het feit gebruiken dat de count-aggregaat alleen de niet-null-waarden telt:

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

U kunt het sum-aggregaat ook op een vergelijkbare manier gebruiken:

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

Antwoord 2, autoriteit 29%

Ervan uitgaande dat u de geretourneerde rijen niet wilt beperken omdat u ook andere waarden aggregeert, kunt u dit als volgt doen:

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

Laten we zeggen dat u in dezelfde kolom waarden van Manager, Supervisor en Teamleider had, dat u de tellingen van elk als volgt zou kunnen krijgen:

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 ...

Antwoord 3, Autoriteit 5%

Het antwoord van @Guffa is uitstekend, wijzen er gewoon op dat misschien schoner is met een IF-verklaring

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

Antwoord 4, Autoriteit 3%

hangt af van wat u bedoelt, maar de andere interpretatie van de betekenis is waar u rijen met een bepaalde waarde wilt tellen, maar niet wilt beperken SELECTop alleen die rijen …

U zou het doen met SUM()met een clausule in, zoals dit in plaats van het gebruik van COUNT():
b.g

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

Antwoord 5, Autoriteit 2%

U kunt ook het sleutelwoordje gebruiken als u SQL 2005 of hoger gebruikt

meer info en van technet

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

Testdata set

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

Antwoord 6

Als u Postgres of SQLite gebruikt, kunt u de filtercomponent gebruiken om de leesbaarheid te verbeteren:

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

BigQuery heeft ook Countif– bekijk hier de ondersteuning voor verschillende SQL-dialecten voor deze functies:
https://modern-sql.com/feature/filter


Antwoord 7

Bedoel je precies dit:

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

Zo ja, dan werkt dat!


Antwoord 8

Ik weet dat dit heel oud is, maar ik hou van de NULLIF-truc voor dergelijke scenario’s en ik heb tot nu toe geen nadelen gevonden. Zie mijn voorbeeld van kopiëren en plakken, dat niet erg praktisch is, maar laat zien hoe het te gebruiken.

NULLIFkan een kleine negatieve invloed hebben op de prestaties, maar ik denk dat het nog steeds sneller moet zijn dan subquery’s.

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

Opmerkingen worden gewaardeerd 🙂


Antwoord 9

SELECT COUNT(*) FROM bla WHERE Position = 'Manager'

Antwoord 10

Opmerking met PrestoDB SQL (van Facebook), er is een snelkoppeling:

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

count_if(x) → bigint

Retourneert het aantal TRUE invoerwaarden. Dit
functie is gelijk aan count(CASE WHEN x THEN 1 END)


Antwoord 11

Dit is wat ik deed om een dataset te krijgen met zowel het totaal als het aantal dat aan de criteria voldeed, binnen elke verzendcontainer. Dat liet me de vraag beantwoorden “Hoeveel zeecontainers hebben meer dan X% items groter dan maat 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

Antwoord 12

Ik denk dat je een eenvoudige WHERE-clausule kunt gebruiken om alleen het aantal records te selecteren.

Other episodes