zoukankan      html  css  js  c++  java
  • [z]SQL中Case的妙用(四)

    六,在Case函数中使用合计函数 

    假设有下面一个表

    学号(std_id)

    课程ID(class_id)

    课程名(class_name)

    主修flag(main_class_flg)

    100

    1

    经济学

    Y

    100

    2

    历史学

    N

    200

    2

    历史学

    N

    200

    3

    考古学

    Y

    200

    4

    计算机

    N

    300

    4

    计算机

    N

    400

    5

    化学

    N

    500

    6

    数学

    N


    有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。 
    现在我们要按照下面两个条件对这个表进行查询 

    1. 只选修一门课程的人,返回那门课程的ID 

    2. 选修多门课程的人,返回所选的主课程ID 


    简单的想法就是,执行两条不同的SQL语句进行查询。 
    条件1 

    --条件1:只选择了一门课程的学生

     

    SELECT std_id, MAX(class_id) AS main_class

     

    FROM Studentclass

     

    GROUP BY std_id

     

    HAVING COUNT(*) = 1;


    执行结果1 

    STD_ID   MAIN_class

    ------   ----------

    300      4

    400      5

    500      6


    条件2 

    --条件2:选择多门课程的学生

     

    SELECT std_id, class_id AS main_class

     

    FROM Studentclass

     

    WHERE main_class_flg = 'Y' ;

     


    执行结果2 

    STD_ID  MAIN_class

    ------  ----------

    100     1

    200     3


    如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示 

    SELECT  std_id,

     

    CASE WHEN COUNT(*) = 1  --只选择一门课程的学生的情况

     

    THEN MAX(class_id)

     

    ELSE MAX(CASE WHEN main_class_flg = 'Y'

     

    THEN class_id

     

    ELSE NULL END

    )

     

    END AS main_class

     

    FROM Studentclass

     

    GROUP BY std_id;


    运行结果 

    STD_ID   MAIN_class

    ------   ----------

    100      1

    200      3

    300      4

    400      5

    500      6


    通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 
    最后提醒一下使用Case函数的新手注意不要犯下面的错误 

    CASE col_1

     

    WHEN 1        THEN 'Right'

     

    WHEN NULL  THEN 'Wrong'

     

    END


    在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。

    CASE col_1

     

    WHEN 1        THEN 'Right'

     

    WHEN col_1 is NULL  THEN 'Wrong'

     

    END

  • 相关阅读:
    关于host,nslookup,dig 的安装
    本机网络连接虚拟机
    centos7 安装显卡驱动方法
    #2002 无法登录 MySQL 服务器
    DWM1000 定位操作流程--[蓝点无限]
    DWM1000 三基站一标签定位HEX
    DWM1000 巧用Status 快速Debug
    DWM1000 多个基站定位讨论 --[蓝点无限]
    DWM1000 收发RXLED TXLED控制代码修改
    DWM1000 多个标签定位讨论 --[蓝点无限]
  • 原文地址:https://www.cnblogs.com/jjj250/p/2628640.html
Copyright © 2011-2022 走看看