示例1:测试数据:
SQL> select * from score;
ID CLASS STUDENT COURSE SCORE
---------- ----- ------- ------ ----------
1 一 张三 数学 90
2 一 张三 语文 89
3 一 李四 数学 26
4 一 李四 语文 31
5 二 王五 数学 90
6 二 王五 语文 80
7 二 赵六 数学 70
8 二 赵六 语文 79
8 rows selected
实现一个SQL,要求统计一二班考试总人数,总成绩,语文考试总成绩,参加考试人数?
解:
SQL> select class,
2 sum(score),
3 count(distinct student),
4 sum(case
5 when course = '语文' then
6 score
7 else
8 null
9 end)
10 from score
11 group by class;
CLASS SUM(SCORE) COUNT(DISTINCTSTUDENT) SUM(CASEWHENCOURSE='语文'THENS
----- ---------- ---------------------- ------------------------------
二 319 2 159
一 236 2 120
SQL> select t1.class,
2 sum(t1.score),
3 count(distinct t1.student),
4 (select sum(t2.score)
5 from score t2
6 where t2.course = '语文'
7 and t2.class = t1.class)
8 from score t1
9 group by class;
CLASS SUM(T1.SCORE) COUNT(DISTINCTT1.STUDENT) (SELECTSUM(T2.SCORE)FROMSCORET
----- ------------- ------------------------- ------------------------------
二 319 2 159
一 236 2 120
在这个子查询中,case when相当于一个子查询,在group by class分组的基础上进行二次筛选,最终可以求出语文总成绩。
示例二:
已知四张表,第一张为用户表,里面有 小明 id为1,小红 id为2,小王 id为3, 小明 id为4, 小张 id为5这五个人。
第二张为数学作业表,通过用户id,然后用count可以获取每个用户数学作业完成总数,
第三张为语文作业表,通过用户id,然后用count可以获取每个用户语文作业完成总数,
第四张为英语作业表,通过用户id,然后用count可以获取每个用户英语作业完成总数,
现在需要获取五个用户的数学 ,语文, 英语 三门作业完成的总数,然后排出前三名,
返回给后台这三个人的姓名,和完成总数
解:
select *
from (select t.name, (m + y + e) as sum
from (select t1.name,
(select count(1) from t2 where t1.id = t2.id) as m,
(select count(1) from t3 where t1.id = t3.id) as y,
(select count(1) from t4 where t1.id = t4.id) as e
from t1) t
order by sum desc)
where rownum < 4;