如何按mysql中的年龄段分组用户数

时间:2011-01-10 09:33:33

标签: mysql

基本上我有一个mysql数据库,包含用户及其相应的出生日期。我还发现了以下一些代码,可以帮助我找到用户从出生之日起的实际年龄。 Finding date of birth我需要做的是找到不同的“年龄段”并计算该年龄段的用户数量。我还发现了this示例,其中显示了如何对此数据进行分组。我想首先计算年龄并以类似于以下link中所示的方式使用它。我编写了以下代码,运行时遇到错误:

SELECT DATE_FORMAT(NOW(), '%Y') -
DATE_FORMAT(data_of_birth, '%Y') -
(DATE_FORMAT(NOW(), '00-%m-%d') <
DATE_FORMAT(data_of_birth,
'00-%m-%d')) AS age, COUNT(*),  
CASE  
  WHEN age >= 10 AND age <= 20 THEN '10-20'  
  WHEN age >=21 AND age <=30 THEN '21-30'  
  WHEN age >=31 AND age <=40 THEN '31-40'  
  WHEN age >=41 AND age <= 50 THEN '31-40'  
  WHEN age >=51 AND age <=60 THEN '51-60'  
  WHEN age >=61 THEN '61+'   
END AS ageband  
.. ..   
GROUP BY ageband  

我收到一条错误消息,指出现场年龄未知。我写错了吗?我可以轻松地编写整个代码块来计算在case语句中写入年龄的年龄,但这似乎效率非常低。我不是很擅长mysql(还),我知道必须有更好的方法来做到这一点。我想我的主要问题是,是否有某种方法可以在查询中创建一个函数并将该函数的输出分配给一个值?

1 个答案:

答案 0 :(得分:15)

在这种情况下,您可以使用子查询:

SELECT
  COUNT(*),
  CASE
    WHEN age >=10 AND age <=20 THEN '10-20'
    WHEN age >=21 AND age <=30 THEN '21-30'
    WHEN age >=31 AND age <=40 THEN '31-40'
    WHEN age >=41 AND age <=50 THEN '41-50'
    WHEN age >=51 AND age <=60 THEN '51-60'
    WHEN age >=61 THEN '61+'
  END AS ageband
FROM
  (
     DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age,
.. ..
  ) as tbl
GROUP BY ageband;

首先它执行子查询并构建一个年龄表,而不是聚合年龄值。