mysql 分段统计数据

一、序言

       数据库用了很久了,期间也遇到过很多麻烦的SQL,以前一直没好好记录,自己也记不住,挺遗憾的,这次分享的是一个简单的分段统计的问题:student 表{id,name,score} 字段,统计各个分数段的人数。

      规则:60以下不及格,60-70差,70-80中,80-90良,90-100优。(好熟悉的感觉....)

    

 

二、代码:

       

Java代码  收藏代码
  1. SELECT  
  2.   sum(CASE when score<60 then 1 else 0 end)   AS '不及格',  
  3.   sum(CASE when score>=60 and score<70 then 1 else 0 end)   AS '差',  
  4.   sum(CASE when score>=70 and score<80 then 1 else 0 end)   AS '中',  
  5.   sum(CASE when score>=80 and score<90 then 1 else 0 end)   AS '良',  
  6.   sum(CASE when score>=90 and score<=100 then 1 else 0 end)   AS '优'  
  7. from student;  

 

 

三、小结:

      1.其实学SQL的时候就写过这些,只是有时候突然别人让你写,有呆了- -

      2.题目比较简单,还有其他比如 分组统计 、 平均值 、行转列等类似的,挺多的,抽时间多整理下吧

      3.有不对的地方请指出,更好的方案可以提出,比如一些函数可以直接统计的,当然考虑效率。

      4.希望朋友遇到比较有特色的SQL 能自己记录并分享出来,我这里以后也会持续记录了,SQL这些除了掌握基本的优化手段以外,很多还是要靠经验积累,平时遇到麻烦的SQL比较少,那么很难得到提升,如果大家都分享出来,然后动手去做,优化,那么相信大家能进步得更快,分享快乐~.~

### MYSQL中的年龄分段查询与统计MySQL中实现年龄分段的查询和统计,可以通过计算出生日期字段来推导用户的年龄,并基于此进行条件筛选或聚合操作。以下是具体的解决方案: #### 计算用户年龄 通过`CURDATE()`函数获取当前日期,并结合`YEAR()`提取年份部分,可以计算出用户的实际年龄。假设表中有名为`birthday`的列存储用户的生日,则可以用如下SQL语句计算年龄[^2]: ```sql SELECT (YEAR(CURDATE()) - YEAR(birthday)) - IF(RIGHT(CURDATE(), 5) < RIGHT(birthday, 5), 1, 0) AS age FROM users; ``` 这里的关键在于判断当年的具体生日是否已经过去,如果未到则需减去一年。 #### 实现年龄分段统计 为了完成按年龄段划分并统计数据的任务,可采用`CASE WHEN`结构定义不同的区间范围,再利用`GROUP BY`对各组数据汇总数量。下面是一个例子展示如何按照指定区间接口执行这一过程[^2]: ```sql SELECT CASE WHEN age BETWEEN 0 AND 18 THEN '0-18' WHEN age BETWEEN 19 AND 30 THEN '19-30' WHEN age BETWEEN 31 AND 40 THEN '31-40' ELSE '>40' END AS age_group, COUNT(*) AS count FROM ( SELECT (YEAR(CURDATE()) - YEAR(birthday)) - IF(RIGHT(CURDATE(), 5) < RIGHT(birthday, 5), 1, 0) AS age FROM users ) subquery GROUP BY age_group; ``` 这段代码首先创建了一个子查询用于生成每位用户的精确岁数;接着在外层查询里运用逻辑表达式把所有记录分配至相应的类别之中最后加以总计得出结果集。 #### 使用时间戳处理方式 当数据库内的生日是以Unix 时间戳形式保存时,需要先将其转换成标准日期格式才能进一步运算。此时可以借助`FROM_UNIXTIME()`函数达成目标[^2]: ```sql SELECT CASE WHEN user_age >=0 AND user_age <=18 THEN '0-18' WHEN user_age >=19 AND user_age <=30 THEN '19-30' WHEN user_age >=31 AND user_age <=40 THEN '31-40' ELSE '>40' END AS age_group, COUNT(*) AS count FROM( SELECT YEAR(CURDATE())-YEAR(FROM_UNIXTIME(birthday,'%Y-%m-%d'))- IF(STRCMP(SUBSTRING(CURDATE(),6),'-'SUBSTRING(FROM_UNIXTIME(birthday,'%Y-%m-%d'),6)),1,0)AS user_age FROM wp_fuser WHERE birthday IS NOT NULL AND LENGTH(TRIM(birthday))>0 )subquery GROUP BY age_group ORDER BY FIELD(age_group,'0-18','19-30','31-40', '>40'); ``` 该脚本同样遵循先前描述的方法论,不过它特别针对那些以整型数值代表秒级时刻点的情况进行了适配调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值