Можно ли указать условие в Count ()? - PullRequest
340 голосов
/ 09 сентября 2009

Можно ли указать условие в Count()? Я хотел бы сосчитать только те строки, которые имеют, например, «Менеджер» в столбце «Позиция».

Я хочу сделать это в выражении count, не используя WHERE; Я спрашиваю об этом, потому что мне нужно считать обоих Менеджеров и Других в одном и том же SELECT (что-то вроде Count(Position = Manager), Count(Position = Other)), поэтому WHERE для меня бесполезно в этом примере.

Ответы [ 12 ]

588 голосов
/ 09 сентября 2009

Если вы не можете просто ограничить сам запрос предложением where, вы можете использовать тот факт, что агрегат count учитывает только ненулевые значения:

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

Вы также можете использовать агрегат sum аналогичным образом:

select sum(case Position when 'Manager' then 1 else 0 end)
from ...
200 голосов
/ 09 сентября 2009

Предполагая, что вы не хотите ограничивать возвращаемые строки, так как вы агрегируете и другие значения, вы можете сделать это следующим образом:

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

Допустим, в том же столбце, где у вас были значения «Менеджер», «Супервизор» и «Командный лидер», вы можете получить счет каждого из них следующим образом:

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 ...
23 голосов
/ 20 мая 2016

@ Ответ Гуффы отличный, просто отметьте, что, может быть, чище с утверждением IF

select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...
20 голосов
/ 09 сентября 2009

Зависит от того, что вы имеете в виду, но другая интерпретация значения - это то, где вы хотите посчитать строки с определенным значением, но не хотите ограничивать SELECT ТОЛЬКО этими строками ...

Вы бы сделали это, используя SUM() с предложением, например, вместо использования COUNT(): например,

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
12 голосов
/ 09 сентября 2009

Вы также можете использовать ключевое слово Pivot, если вы используете SQL 2005 или выше

больше информации и от Technet

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

Набор тестовых данных

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')
3 голосов
/ 12 февраля 2016

Я знаю, что это действительно старый, но мне нравится трюк NULLIF для таких сценариев, и я пока не нашел минусов. Просто посмотрите на мой пример копирования и вставки, который не очень практичен, но демонстрирует, как его использовать.

NULLIF может оказать небольшое негативное влияние на производительность, но я думаю, это все равно должно быть быстрее, чем подзапросы.

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

Комментарии приветствуются: -)

2 голосов
/ 09 сентября 2009

Вы имеете в виду именно это:

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

Если это так, то да, это работает!

0 голосов
/ 17 июня 2019

Вот что я сделал, чтобы получить набор данных, который включал в себя как общее количество, так и число, отвечающее критериям, в каждом транспортном контейнере. Это позволило мне ответить на вопрос: «Сколько транспортных контейнеров имеют более чем X% товаров размера 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
0 голосов
/ 11 декабря 2017

Обратите внимание, что в PrestoDB SQL (из Facebook) есть ярлык:

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

count_if (x) → bigint

Возвращает количество ИСТИННЫХ входных значений. это функция эквивалентна счету (СЛУЧАЙ, КОГДА x ТО 1 КОНЕЦ)

0 голосов
/ 18 марта 2015

Используя это, вы получите счет для менеджеров

Select Position, count(*) as 'Position Counter'
from your_table 
group by Position 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...