Можно ли указать условие в Count ()?

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

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

12 ответов


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

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

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

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

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

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

ответ@Guffa отличный, просто укажите, что, возможно, чище с помощью оператора IF

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

зависит от того, что вы имеете в виду, но другая интерпретация значения-это то, где вы хотите подсчитать строки с определенным значением, но не хотите ограничивать выбор только этими строками...

вы бы сделали это, используя SUM() с предложением in, как это вместо использования 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

вы также можете использовать ключевое слово 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')

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

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

комментарий оценили :-)


Я думаю,вы можете использовать простое предложение WHERE для выбора только записи count some.


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

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

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


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

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

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

count_if (x) → bigint

возвращает количество истинных входных значений. Этот функция эквивалентна count (случай, когда x затем 1 конец)


добавить WHERE предложение и вы хорошо идти.


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

Select Position, count(*) as 'Position Counter'
from your_table 
group by Position