mysql根据出生日期统计各年龄段男女人数

表格名称 user, 字段 id, sex ( M 表示男, F表示 女), birthday出生日期, 没有 age字段

其中 ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) 是获得 年龄

CASE WHEN的格式是:

CASE
   WHEN  ( 条件)  THEN  结果
   WHEN  ( 条件)  THEN  结果
   WHEN  ( 条件)  THEN  结果
END
select count(id) as count,
       (
       CASE 
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 0 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 12 THEN '0-12岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 13 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 17 THEN '13-17岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 18 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 22 THEN '18-22岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 23 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 40 THEN '23-30岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 41 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 59 THEN '41-59岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 60 THEN '60岁以上'
       END 
       ) as ageRange
       , sex
from user
GROUP BY 
       CASE 
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 0 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 12 THEN '0-12岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 13 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 17 THEN '13-17岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 18 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 22 THEN '18-22岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 23 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 40 THEN '23-30岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 41 and ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) <= 59 THEN '41-59岁'
       WHEN ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) >= 60 THEN '60岁以上'
       END
    ,sex

结果:
在这里插入图片描述

改进:

SELECT nnd as ageRange,sex,count(*) as count from(
  SELECT
   CASE
    WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 0 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 12 THEN '0-12岁'
    WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 13 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 17 THEN '13-17岁'
    WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 18 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 22 THEN '18-22岁'
    WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 23 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 40 THEN '23-30岁'
    WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 41 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 59 THEN '41-59岁'
    WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 60 THEN '60岁以上'
   END 
   as nnd,people_sex as sex
   from people_info_sync
) a GROUP BY nnd,sex;

存在的缺点: 如果0-12岁的总数 为 0, 则不会返回该数据

猜你喜欢

转载自blog.csdn.net/why_su/article/details/82829253