1

我有一个包含客户的数据库表,其中包含他们的每个年龄等。

我想查询客户并将他们分类为年龄组以获得如下结果:

Age_Group   Num_Of_Cust 
 0-10        Count 
 10-20       Count 
 20-30       Count 

这可以在单个查询中完成吗?我基本上想插入表格行值并在第二列中计算该年龄段的人数。

4

3 回答 3

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;

(我不喜欢子选择,但似乎有必要获得正确的排序和标签。Age_Group例如,排序本身会在 20-29 之前放置 100-109。尝试强制转换让Age_GroupPostgreSQL 抗议它不是一个列。最后as X是还需要消除子查询需要别名的抱怨。)

于 2012-12-03T20:48:09.987 回答
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”,因此所有组名的长度都相同。子查询不是绝对必要的。我觉得它更具可读性。

于 2012-12-03T20:51:10.880 回答
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
于 2012-12-03T20:44:03.357 回答