这是我的人员表:
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