是否可能在群组中具有非聚合条件? 例如,我们有:
Table1(firstName, lastName, gender)
我们分组 firstName
,然后分组lastName
,但我们只想要其中至少有5个男性的群组。或者另一个例子是没有任何男性或其他条件的群体。
实际上我通过使用案例来解决它,但我正在寻找是否有直接的解决方案。
这个问题的另一种形式是,我们只想要包含至少一个18岁以上的人的群体,或任何类似的问题。
答案 0 :(得分:1)
我不知道这是否与您使用案例的解决方案相似,但我认为这是最简单的方法。
基本上,您可以将与条件匹配的行数相加,而不仅仅是计数,因此模式始终为:SUM(CASE WHEN <condition> THEN 1 [ELSE 0] END
。在HAVING
子句中,您可以按此类聚合进行过滤。
由于count
不计算null
,因此您也可以将其写为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名男性
。要写一个女人和至少一个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岁的人可能是三个女人中的一个或一个人。但您也可以结合案例中的条件。例如:&#39;至少5名18岁或以上的男性&#39;:
HAVING
SUM(CASE WHEN Gender = 'M' AND Age >= 18 THEN 1 ELSE 0 END) >= 5
我希望这些例子可以帮助您找到所需条件。