• PIVOT内置函数实现行转列


      PIVOT用于将列值旋转为列名(即行转列),PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

    完整语法:

    table_source

    PIVOT(

    聚合函数(value_column)

    FOR pivot_column

    IN(<column_list>)

    )

      UNPIVOT用于将列明转为列值(即列转行),可以用UNION来实现

    完整语法:

    table_source

    UNPIVOT(

    value_column

    FOR pivot_column

    IN(<column_list>)

    )

    案例:

    姓名         课程         分数
    ---------- ---------- -----------
    张三         语文         74
    张三         数学         83
    张三         物理         93
    李四         语文         74
    李四         数学         84
    李四         物理         94

    根据姓名统计这个人的三门成绩,即:姓名   语文   数学  物理

    首先看看使用case when end结构的时候:

    select 姓名,
     max(case 课程 when '语文' then 分数 else 0 end)语文,
     max(case 课程 when '数学'then 分数 else 0 end)数学,
     max(case 课程 when '物理'then 分数 else 0 end)物理
    from tb
    group by 姓名

    --------------------------------结果------------------------------------------------------------------------------------

    姓名         语文          数学          物理
    ---------- ----------- ----------- -----------
    李四         74          84          94
    张三         74          83          93

    这个结果就是我们想要的,然后再看看使用pivot:

    select * from tb pivot(max(分数) for 课程 in (语文,数学,物理))a

    --------------------------------结果------------------------------------------------------------------------------------

    姓名         语文          数学          物理
    ---------- ----------- ----------- -----------
    李四         74          84          94
    张三         74          83          93

  • 相关阅读:
    递归
    书评:《C程序设计语言》
    下一代互联网,今日揭开面纱:IPv6真的要来了
    庆祝Alan Mathison Turing(艾伦·图灵)诞辰100周年!
    svn常用命令行和批处理
    ORACLE 9i数据导入到ORACLE 10G中文出现的乱码问题
    Oracle 11G 的客户端,不再支持连接到ORACLE 8I
    DB2 一个汉字的Byte数,太操蛋了
    关于Windows 7 64位下Visual Studio 2010 开发的Asp.net程序连接Oracle 的出现的问题
    Web Frame 跨域调用Session 丢失问题
  • 原文地址:https://www.cnblogs.com/chen8023miss/p/11242766.html
Copyright © 2020-2023  润新知