我有一个包含客户的数据库表,其中包含他们的年龄等等。
我想查询客户并将其分类为年龄组,以获得如下结果:
Age_Group Num_Of_Cust
0-10 Count
10-20 Count
20-30 Count
这可以在单个查询中执行吗?我基本上想要插入表行值并计算第二列中该年龄组的人数。
答案 0 :(得分:2)
尝试类似
的内容select age / 10, count(*) from table_name group by age / 10 order by age / 10;
这将为您提供一个结果,其中行首先包含分组年龄的十列,然后是该范围内的数字。范围实际上是0-9,10-19等;如果您想将其向上移动,可以将age
替换为(age-1)
。请注意,它还会跳过不包含客户的范围。
为了更准确地再现所请求的输出 - 但可能不适用于所有RDBMS(在PostgreSQL上测试),可以使用以下内容:
select concat(Age*10, '-', Age*10+9) as Age_Group, Num_of_Cust from (
select age / 10 as Age, count(*) as Num_Of_Cust from test
group by age / 10 order by age / 10) as X;
(我不喜欢subselect,但似乎有必要获得正确的排序和标签。按Age_Group
排序本身会在20-29之前放置100-109。尝试投射{{1}有PostgreSQL抗议它不是一个列。最后Age_Group
也需要消除子查询需要别名的抱怨。)
答案 1 :(得分:1)
一个简单的case
语句可以解决问题:
select agegroup, count(*)
from (select (case when age <= 10 then '00-10'
when age <= 20 then '11-20'
when age <= 30 then '21-30'
else '31+'
end) as agegreoup, t.*
from t
) t
group by agegroup
我为其他人包括了最后一组(并假设年龄永远不会消极)。另外,我使用'00 -10'而不是'0-10',所以所有组名都有相同的长度。子查询不是绝对必要的。我发现它更具可读性。
答案 2 :(得分:0)
我会做这样的事情:
SELECT
Coalesce(case when age<10 then '0-9' end,
case when age between 10 and 20 then '10-20' end,
case when age>20 then '>20' end) As Age_Group,
Count(*)
From your_table
Group by Age_Group