zoukankan      html  css  js  c++  java
  • SQL Server中CASE WHEN的用法

    工作中经常使用的一个关键字:CASE。说起CASE还得从我刚进入第一家公司的面试说起。

    第一家公司是我第一次面试公司,当时还是有点小紧张。在和HR沟通之后,就开始做三道面试题,给我影响深刻的是第一道和第三道都是用的CASE,因为之前对CASE比较了解,笔试也就顺利通过了。

    CASE是一个标量表达式,它是基于条件逻辑返回一个值。只能用在标量表达式中(如SELECT,WHERE,HAVING和ORDER BY子句等)

    CASE具有两种格式:简单CASE函数和CASE搜索函数。

    --简单CASE函数
    CASE sex
    WHEN '1' THEN '男'
    WHEN '2' THEN '女'
    ELSE '其他' END
    --CASE搜索函数
    CASE WHEN sex = '1' THEN '男'
    WHEN sex = '2' THEN '女'
    ELSE '其他' END

    这里我想说的是CASE的独到用处,就是行转列功能。看如下的一个示例:

    IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb

    GO

    CREATE TABLE tb(姓名 NVARCHAR(10),课程 NVARCHAR(10),分数 INT)

    INSERT INTO tb VALUES (N'张三',N'语文',74)
    INSERT INTO tb VALUES (N'张三',N'数学',83)
    INSERT INTO tb VALUES (N'张三',N'物理',93)
    INSERT INTO tb VALUES (N'李四',N'语文',74)
    INSERT INTO VALUES (N'李四',N'数学',84)
    INSERT INTO VALUES (N'李四',N'物理',94)

    GO

    SELECT * FROM tb

    GO

    执行完成后的结果如图:

     

    开始进行行列转换:

     

    SELECT 姓名,

    MAX(CASE 课程 WHEN N'语文' THEN 分数 ELSE 0 END) 语文,

    MAX(CASE 课程 WHEN N'数学' THEN 分数 ELSE 0 END) 数学,

    MAX(CASE 课程 WHEN N'物理' THEN 分数 ELSE 0 END) 物理

    FROM tb

    GROUP BY 姓名

    执行结果如下:


     

    这样就很好的完成了行列的转换了,当然这只是一个比较简单的例子,SQL Server 2005版之后有单独的行列转换功能PIOVT,以下查询同样可以得到上面的结果:

    SELECT * FROM tb PIVOT( MAX(分数) FOR 课程 IN (语文,数学,物理))a

    这个功能特别适合那时候业务系的一些数据的提取,我在工作上用的比较多,这里分享给大家。

     

    有兴趣可以关注我的公众号:SQL数据库开发,转载请注明出处,谢谢!
  • 相关阅读:
    设计师用的几个网站
    微信小程序开发框架
    数据模型
    数据库系统
    大话设计模式读书笔记(一)
    关于数据统计时的效率
    orcale同一条语句运行速度差异问题
    使用plspl创建orcale作业
    正则表达式(一)
    oracle游标小试
  • 原文地址:https://www.cnblogs.com/sql-road/p/9181355.html
Copyright © 2011-2022 走看看