• 数据库中行转列


    关于Oracle中的最基础的行转列用法,暂时了解的是两个函数:decodecase when函数,用法如下:

    首先是表格代码:

    1 create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
    2 insert into tb values('张三' , '语文' , 74);
    3 insert into tb values('张三' , '数学' , 83);
    4 insert into tb values('张三' , '物理' , 93);
    5 insert into tb values('李四' , '语文' , 74);
    6 insert into tb values('李四' , '数学' , 84);
    7 insert into tb values('李四' , '物理' , 94);
    创建表格

     1、使用decode函数实现:

    1 select   姓名 , 
    2          max(decode(课程 , '语文',分数)) 语文,       
    3          max(decode(课程 , '数学',分数)) 数学,       
    4          max(decode(课程 , '物理',分数)) 物理,
    5          avg(分数) 平均分,
    6          sum(分数) 总分
    7 from tb
    8 group by 姓名
    decode行转列

    2、使用case when实现:

    1 select  姓名,
    2         sum(case 课程 when '语文' then 分数 else 0 end) 语文,
    3         sum(case 课程 when '数学' then 分数 else 0 end) 数学,
    4         sum(case 课程 when '物理' then 分数 else 0 end) 物理,
    5         avg(分数) 平均分,
    6         sum(分数) 总分
    7 from tb
    8 group by 姓名
    case when行转列

    需要注意的是,上面的两种是在Oracle中使用的,如果在sqlserver中实现的话,就只能用case when语句实现,不能用decode函数实现


    后续补充:

    Oracle 11g后,出现PIVOT,更简便地实现“行转列”。使用前,需确定数据库环境大于11g,最好也确认下生产环境的数据库是否大于11g,避免项目后期出现状况。

      PIVOT用于将列值旋转为列名(即行转列);

      PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

      

    完整语法:

    table_source

    PIVOT(

    聚合函数(value_column)

    FOR pivot_column

    IN(<column_list>)

    )

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

    完整语法:

    table_source

    UNPIVOT(

    value_column

    FOR pivot_column

    IN(<column_list>)

    )

    这里学习的是行转列,关于UNPIVOT是列转行的,以后再补充,下面是PIVOT行转列的实现:

    3、使用PIVOT实现:

    1   with tmp_tab1 as(
    2                     select 姓名,课程,分数
    3                     from tb 
    4                   )
    5 select * from tmp_tab1  pivot(sum(t.分数) for 课程 in('语文','数学','物理'));
    PIVOT行转列
    1 select * from (select t.姓名,t.课程,t.分数 from tb t) aa PIVOT (sum(aa.分数) for 课程 in('语文','数学','物理'));
    PIVOT行转列1

  • 相关阅读:
    css中的选择器
    HTML5总结
    table中的一些另类标签
    form表单
    Laravel常用命令行中文版
    浅谈Session与Cookie的区别与联系
    Wechat微信公众平台开发
    js中的正则表达式入门
    畅谈Redis和Memcached的区别
    php的ob缓存详解
  • 原文地址:https://www.cnblogs.com/csschn/p/4961660.html
Copyright © 2020-2023  润新知