如何计算GROUP BY查询中条件匹配的行数



这是我的人员表:

neighborhood  birthyear
a             1958
a             1959
b             1970
c             1980

我想得到每个社区某个年龄段的人的COUNT。例如,如果我想让所有18岁以下的人都参加,我会得到:

neighborhood  count
a             0
b             0
c             0

如果我想让每个人都超过50岁,我会得到

neighborhood  count
a             2
b             0
c             0

我试过

SELECT neighborhood, COUNT(*)
FROM persons
WHERE YEAR(NOW()) - persons.birthyear < 18
GROUP BY neighborhood;

但这给了我0行,而我想要3行不同的邻域,每行0计数。我该如何做到这一点?

您可以使用条件聚合:

SELECT neighborhood, SUM(YEAR(NOW()) - p.birthyear) as under_18,
SUM(YEAR(NOW()) - p.birthyear BETWEEN 34 AND 42) as age_34_42
FROM persons p
GROUP BY neighborhood;

我认为如果计数为0,那么该行就不会出现。在我看来,你的代码似乎是正确的,如果你在50岁的例子中尝试它,它应该会给你一行预期的行(邻域:a,计数:2(

我建议使用子查询:

SELECT 
count(*) [group-by-count-greater-than-ten] 
FROM 
(
SELECT 
columnFoo, 
count(*) cnt
FROM barTable
WHERE columnBaz = "barbaz"
GROUP BY columnFoo
) 
AS subQuery
WHERE cnt > 10

在上文中,subquery返回结果集正被main query用作任何其他表。

cnt不再被main query视为计算字段,并且不必引用count()函数。

但是,在运行where子句或必须查看别名cnt列的having子句的subquery中,必须引用count()函数,因为在subquery中引用cnt会引发错误。

在您的情况下,使用subquery看起来像这样。

SELECT 
neighborhood, 
age, 
count(*) as cnt
FROM
(
SELECT 
*, 
(YEAR(NOW()) - birthyear) as age 
FROM PERSONS
) as WithAge
WHERE age < 18
GROUP BY neighborhood, age