关于Oracle中的最基础的行转列用法,暂时了解的是两个函数:decode和case 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 姓名
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 姓名
需要注意的是,上面的两种是在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('语文','数学','物理'));
1 select * from (select t.姓名,t.课程,t.分数 from tb t) aa PIVOT (sum(aa.分数) for 课程 in('语文','数学','物理'));