Можно ли указать условие в 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 или выше
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
комментарий оценили :-)
вы имеете в виду именно это:
SELECT Count(*) FROM YourTable WHERE Position = 'Manager'
если да, то да, это работает!
Примечание с PrestoDB SQL (из Facebook), есть ярлык:
https://prestodb.io/docs/current/functions/aggregate.html
count_if (x) → bigint
возвращает количество истинных входных значений. Этот функция эквивалентна count (случай, когда x затем 1 конец)
используя это, вы получите счет для менеджеров
Select Position, count(*) as 'Position Counter'
from your_table
group by Position