数据库查询数据行转列

发布于:2022-11-06 ⋅ 阅读:(757) ⋅ 点赞:(0)

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
--这种情况下数学这个值和缺考在取最大时,是缺考最大


网站公告

今日签到

点亮在社区的每一天
去签到