工作中遇到的问题——mysql关于年龄,性别的统计
终于暂时闲下来了,一个项目加班加点一年多,前面太忙就顾不上博客了,慢慢的就懈怠了,最近算是暂时闲下来了,项目已经验收进入后期维护阶段,每天空余的时间也多了,想重新拾起博客,不求写什么高深的东西,以后就尽量就每次自己遇到的问题,并把解决方法在这里记录一下,可能显得很简单不适合他人看,但是就当自己日记一样记录还是不错的,因为在这个项目里我有好几次遇到类似的以前解决过的问题,却还是要看了自己当初的百度提问才得以解答,还是要记录下比较好。
这次要记录的是昨天客户找我要一个关于注册用户年龄段,性别分布情况,当时把我卡住了,等到解决了才发现其实这个sql我大二考试的时候就写过,只是把以前是班级现在是年龄,以前是sqlserver现在是mysql而已,话不多说,解决过程如下:
首先,是我们数据库的当前内容:
然后我们要给他最终统计成三个字段:年龄 男 女
需要的最终统计结果图如下:
步骤1:我们要把先他统计成 年龄,性别 的结果
sql:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age,t1.sex FROM test t1 ORDER BY age
其结果如下:
步骤2:将上图的结果作为临时表,再统计成最终结果图
sql:
SELECT CONCAT(age,'岁') AS '年龄',SUM(CASE WHEN sex='男' THEN 1 ELSE 0 END) AS '男',SUM(CASE WHEN sex='女' THEN 1 ELSE 0 END) AS '女' FROM ( SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age,t1.sex FROM test t1 ORDER BY age ) AS tt GROUP BY age
写在最后:
当然实际工作中的数据并不是这样,但是大体上差不多,只是多了一些条件而已,比如xx时间之前注册的。这次统计sql中,关于怎么把生日转化为年龄的sql我确实不会,但是这个很容易百度到,我当时查的是Y橡树Y的文章,其中一篇讲述了5种将生日转化成年龄的sql,我选择了第一种,据说当时间大于当前时间会出错,但是我这里不存在这种场景就取用了。而在将查询结果转换成年龄性别了以后,就看上去很眼熟了,就和我们大学时候遇到的题目一样,班级,姓名,年龄,性别,然后进行分组查询统计。
这次是告诫我自己,有些东西用的少了还不复习确实容易犯一些低级错误,我当时绞尽脑汁想在分组那里做文章,而忘记了sum函数中可以这么干。