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数据库开发,转载请注明出处,谢谢!
  • 相关阅读:
    IE CSS Bug及解决方案参考手册
    如何学习Javascript
    JS获取当前对象大小以及屏幕分辨率等
    自适应网页设计的方法
    【Javascript Trick系列】二、table相关操作
    移动web开发经验总结
    兼容各种浏览器的常用按钮样式
    获取浏览器的高度和宽度
    让页面弹框垂直水平居中
    Vue is used in projects
  • 原文地址:https://www.cnblogs.com/sql-road/p/9181355.html
Copyright © 2011-2022 走看看