首页 > 数据库技术 > 详细

一个经典的数据库分段查询和分组查询综合运用的例子

时间:2015-06-08 22:50:00      阅读:433      评论:0      收藏:0      [点我收藏+]

记得以前面试时遇到的,感觉这个问题比较经典,所以后来整理了下。

题目描述是这样的(凭印象):

请用一条sql统计出每个班级中,20-50分、50-70分、70-100分的人数,

已知:表(exam),有如下字段:class(班级)、name(姓名)、score(分数);

查询显示格式:

 

技术分享

这是个典型的分段又分组的查询案例,难点就是考虑到按班级分组的同时按成绩分段查询。

 

表数据如下:

技术分享

select
    count_abc.class 班级, 
    sum(case when count_abc.a is null then 0 else 1 end) 20-50的人数, 
    sum(case when count_abc.b is null then 0 else 1 end) 50-70的人数, 
    sum(case when count_abc.c is null then 0 else 1 end) 70-100的人数
from 

(
    select 
        case when score between 20 and 50 
        then 1
        end a,
        case when score between 50 and 70 
        then 1
        end b,
        case when score between 70 and 100 
        then 1
        end c,
        class
    from exam
) count_abc
group by count_abc.class;

分组不用说是group by,分段常用是between ... and ...,关键是如何串联。因为每一条数据都有这样一个特性:最多在一个分数段里。容易想到用case when 语句来表达这种互斥关系。

于是想到把所有的分数段分布情况,并用a,b,c区分,再根据标记不同进行累计求和。

上面的sql还可以简化:

select
    count_abc.class 班级, 
    sum(count_abc.a) 20-50的人数, 
    sum(count_abc.b) 50-70的人数, 
    sum(count_abc.c) 70-100的人数
from 

(
    select 
        case when score between 20 and 50 
        then 1
        else 0
        end a,
        case when score between 50 and 70 
        then 1
        else 0
        end b,
        case when score between 70 and 100 
        then 1
        else 0
        end c,
        class
    from exam
) count_abc
group by count_abc.class;

 

一个经典的数据库分段查询和分组查询综合运用的例子

原文:http://www.cnblogs.com/wlink/p/4561999.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!