6

Возможно ли задать условия в Count()?

17

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

Мне нужно сделать это в самом операторе COUNT, а не с помощью WHERE; я спрашиваю об этом, потому что мне нужно посчитать как Менеджеров, так и Других в одном и том же SELECT (что-то вроде Count(Position = 'Менеджер'), Count(Position = 'Другой'), поэтому WHERE не подходит для меня в этом примере.

5 ответ(ов)

9

Если вы не можете ограничить выборку с помощью условия 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 ...

Таким образом, оба метода позволяют подсчитать количество записей, соответствующих определенному условию.

2

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

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

Таким образом, вы получите соответствующие подсчеты для каждой категории должностей в одной выборке.

0

Ответ @Guffa отличный, просто хочу отметить, что, возможно, будет чище использовать оператор IF:

SELECT COUNT(IF(Position = 'Manager', 1, NULL)) AS ManagerCount
FROM ...

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

0

Зависит от того, что именно вы имеете в виду, но другой способ интерпретации заключается в том, что вы хотите посчитать количество строк с определённым значением, но не хотите ограничивать 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

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

0

Если вы используете 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь