注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

sql中case语句用法  

2013-10-15 23:51:58|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、场景
今天遇到一个场景,就是统计一个数据表中用户的某个属性落在不同区间的人数。最常见的例子就是所有学生的成绩分布统计,及格人数、优秀人数等做一个范围的评估。
这个场景非常普遍,也不难解决,当时没有先Google一下,因为只是自己遇到的一个问题,并不需要自己解决,顺便想了下如何解决。当时想法是使用group by,该语法的功能就是将所有group by后表达式相同的聚合在一起,然后求和即可。显然这个不同区间的划分涉及到逻辑判断,也就是
if attr < score1 return range1 else attr < score2
之类的格式,不过这种都是一些命令式的指令而不是表达式。这一点就想到了C语言中的条件表达式
cond ? ret1 : ret2
使用这种语法就可以在表达式中执行逻辑判断流程,相当于将if类型逻辑判断放入了表达式,和if不同,它返回值是一个表达式。
二、实现
大致看了mysql的语法,没有实现C语言的条件表达式,在网上搜索了一下
mysql  count range
关键字,可以找到对于这种问题的解决方法,那就是使用一个更为强大的条件表达式 case,毫不例外,例子来自stackoverflow网站,为了全面期间,摘抄如下
Q:

i have a table t_points in mySql like example in below.

Name          Surname          Point
Joe           Arnold           120
Michale       Black            250
Masha         Petrova          300
Natalie       Jackson          120
John          Turo             200
Bona          Meseda           250
Zeyda         Nura             150
Zanura        Bohara           60
Shaheen       Boz              360
Abbas         Murat            160
Keira         Black            230
Tom           Robinson         480
Fred          Balka            490
Semia         Hudovi           90
Sona          Bahari           60

i want to write a query which will display the count of point ranges. Point ranges are like this: point between 0 and 100, 101 and 200, 201 and 300, 301 and 400. Result must be like below

0_100           101_200          201_300            301_400
3               5                4                  3

i think u understand what i want to say. So which query i have to use for this result?
Thanks.

A:

select count(CASE WHEN point BETWEEN 0 AND 100 THEN 1 END) as count0_100, count(CASE WHEN point BETWEEN 101 AND 200 THEN 1 END) as count101_200, count(CASE WHEN point BETWEEN 201 AND 300 THEN 1 END) as count201_300, ... from t_poits
其实这个问题在网上是可以直接搜到解决方法的,只是自己当时在没有搜索的情况下自己想到,并且是一个实际遇到的问题,比较开心,特单独记录一下。
  评论这张
 
阅读(297)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017