Я не знаю, похоже ли это на ваше «решение, использующее случай», но я считаю, что это самый простой способ сделать это.
В принципе, вместо подсчета вы можете суммировать количество строк, соответствующих условию, поэтому шаблон всегда: SUM(CASE WHEN <condition> THEN 1 [ELSE 0] END
. В предложении HAVING
вы можете фильтровать такие скопления.
С count
не учитывается null
s, вы также можете написать COUNT(CASE WHEN <condition> THEN 1 [ELSE null] END)
. Этот метод, возможно, более ясен, чем способ SUM
, но я больше привык к этому.
SELECT
FirstName, LastName
FROM
Table1
GROUP BY
FirstName, LastName
HAVING
SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) >= 5
Приведенное выше условие относится к «не менее 5 самцов».
Чтобы написать «exacty 3 женщин и, по меньшей мере, один человек старше 18 лет», вы могли бы сделать это следующим образом:
HAVING
SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) = 3
SUM(CASE WHEN Age > 18 THEN 1 ELSE 0 END) >= 1
Этих условия работают отдельно, так и в состоянии выше, в 18-летний человек может быть одной из трех женщин или парней. Но вы также можете комбинировать условия внутри корпуса. Например: «по крайней мере, 5 человек, которые 18 лет и старше»:
HAVING
SUM(CASE WHEN Gender = 'M' AND Age >= 18 THEN 1 ELSE 0 END) >= 5
Я надеюсь, что эти примеры помогут вам найти условие, что вам нужно.
Определив количество самцов, вам не нужно будет включать агрегат в 'COUNT' количество мужчин? –
Вы можете предварительно фильтровать агрегат с 'WHERE' и/или фильтровать агрегатную статистику с помощью' HAVING'. –