Oracle数据库行转列
数据库需要行转列,前提是数据通过group by分组有其他公共有限的数据。例子如下图所示
在oracle中可以有三种方式简单实现数据行转列
pivot函数
-- 建表语句
CREATE TABLE `TEST` (
`NAME` VARCHAR2(20) ,
`PROJECT` varchar(20) ,
`SCORE` NUMBER(5)
)
--模拟数据
insert into TEST(NAME,PROJECT,SCORE) values('张三','语文',90);
insert into TEST(NAME,PROJECT,SCORE) values('张三','数学',85);
insert into TEST(NAME,PROJECT,SCORE) values('张三','英语',80);
insert into TEST(NAME,PROJECT,SCORE) values('李四','语文',100);
insert into TEST(NAME,PROJECT,SCORE) values('李四','数学',95);
insert into TEST(NAME,PROJECT,SCORE) values('李四','英语',100);
insert into TEST(NAME,PROJECT,SCORE) values('王五','语文',80);
insert into TEST(NAME,PROJECT,SCORE) values('王五','数学',70);
insert into TEST(NAME,PROJECT,SCORE) values('王五','英语',60);
insert into TEST(NAME,PROJECT,SCORE) values('赵六','语文',80);
--pivot函数使用语法
select *[查询的字段] from [table]
pivot([聚合函数 for col[列] in('值1','值2'...))
select * from TEST
pivot(max(SCORE) for PROJECT in ('语文' 语文,'数学' 数学,'英语' 英语))
--使用oracle的pivot函数,使用*是查询表中的所有字段,其中会将PROJECT和SCORE字段排除分组(name,project,score)就是name,再将数据行转列
--如果是数据库中还有一个字段id,那么会group by name,id会出现下图情况
--sql还是hi之前的sql,但是其中多了一个字段id
select * from TEST
pivot(max(SCORE) for PROJECT in ('语文' 语文,'数学' 数学,'英语' 英语))
decode函数
select name,
max(decode(PROJECT,'语文',score,0)) 语文,
max(decode(PROJECT,'数学',score,0)) 数学,
max(decode(PROJECT,'英语',score,0)) 英语
from TEST group by NAME
sql方式
select NAME,
MAX(CASE WHEN PROJECT = '语文' THEN SCORE else 0 END) 语文,
MAX(CASE WHEN PROJECT = '数学' THEN SCORE else 0 END) 数学,
MAX(CASE WHEN PROJECT = '英语' THEN SCORE else 0 END) 英语
from TEST group by NAME
select NAME,
MAX(CASE WHEN PROJECT = '语文' THEN PROJECT else '缺' END) 语文,
MIN(CASE WHEN PROJECT = '数学' THEN PROJECT else '缺' END) 数学,
MAX(CASE WHEN PROJECT = '英语' THEN PROJECT else '缺' END) 英语
from TEST group by NAME
--这种情况下数学这个值和缺考在取最大时,是缺考最大