数据库中行转列

关于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

原文地址:https://www.cnblogs.com/csschn/p/4961660.html