Возможно ли задать условия в Count()?
Возможно ли указать условие в функции Count()
? Я хотел бы считать только те строки, которые имеют, например, "Менеджер" в столбце Position.
Мне нужно сделать это в самом операторе COUNT
, а не с помощью WHERE
; я спрашиваю об этом, потому что мне нужно посчитать как Менеджеров, так и Других в одном и том же SELECT
(что-то вроде Count(Position = 'Менеджер'), Count(Position = 'Другой')
, поэтому WHERE
не подходит для меня в этом примере.
5 ответ(ов)
Если вы не можете ограничить выборку с помощью условия 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 ...
Таким образом, оба метода позволяют подсчитать количество записей, соответствующих определенному условию.
Если вы не хотите ограничивать количество возвращаемых строк, так как аггрегируете другие значения, вы можете сделать это следующим образом:
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 ...
Таким образом, код будет более читаемым, и вы сможете разделить логику на более понятные части.
Зависит от того, что именно вы имеете в виду, но другой способ интерпретации заключается в том, что вы хотите посчитать количество строк с определённым значением, но не хотите ограничивать 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
Это позволит вам получить необходимые вам счётчики, не ограничивая выборку строк по условию.
Если вы используете Postgres или SQLite, вы можете воспользоваться конструкцией FILTER
, чтобы улучшить читаемость запросов:
SELECT
COUNT(1) FILTER (WHERE POSITION = 'Manager') AS ManagerCount,
COUNT(1) FILTER (WHERE POSITION = 'Other') AS OtherCount
FROM ...
Кроме того, в BigQuery также доступна функция Countif
. Вы можете ознакомиться с поддержкой этих возможностей в различных диалектах SQL по следующей ссылке: https://modern-sql.com/feature/filter.
Как выполнить UPDATE с использованием SELECT в SQL Server?
"Вставка результатов хранимой процедуры в временную таблицу"
Как экранировать одинарную кавычку в SQL Server?
Как выполнить оператор UPDATE с JOIN в SQL Server?
Для чего действительно нужен SQL-тип данных национального символа (NCHAR)?