• 一个1级分组基础上同时进行2级分组的SQL面试题



    示例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;

  • 相关阅读:
    虚拟空间,域名解析,A记录,MX记录,CNAME记录,TTL 等 更多Web服务器相关名词解释
    C# WinForm中的Label换行方法
    SQL 2005 with(nolock)详解
    常用Web Service汇总(天气预报、时刻表等)
    csdn中一篇sock 经验贴..
    如何保护.net中的dll文件(防破解、反编译)
    C#内存流示例>用内存流来读取图片
    QQ网页登陆密码加密方式(农场、空间、WebQQ等通用)
    MySQL数据库对dvbbs.php全文搜索的完全分析
    提搞网站访问速度可做哪些优化
  • 原文地址:https://www.cnblogs.com/wcwen1990/p/7601196.html
Copyright © 2020-2023  润新知