07 面试题——行列转换

去了一家公司进行面试,给了一个行列转换的问题:

列转行

将【题目所用表格】变成【模板要求】中表格的样子

题目表格:

模板要求:

1.首先来建表,并插入数据

--我直接用字母了,就没有用中文建立字段了
create table course_r(
	name varchar(10),
	yw int,
	sx int,
	wl int
);
insert into course_r values('李四',74,84,94);
insert into course_r values('刘五',74,83,63);

select * from course_r;

查询之后得到的结果集


2.使用union all实现列转行

select * from (
    
    select name as '姓名','语文'as '科目',yw as '分数' from course_r 
    union all 
    select name as '姓名','数学'as '科目',sx as '分数' from course_r 
    union all
    select name as '姓名','物理'as '科目',wl as '分数' from course_r 
)t

查询得到的结果集: 

3.我们也能够用unpivot实现列转行

select * from course_r 
unpivot(score for Sourse in (yw ,sx,wl)) t;

行转列

1.首先创建数据

create table course
(
	name varchar(10) ,
	course varchar(10) ,
	score int
);
insert into course values('刘五','语文','74');
insert into course values('刘五','数学','83');
insert into course values('刘五','物理','63');
insert into course values('李四','语文','74');
insert into course values('李四','数学','84');
insert into course values('李四','物理','94');

select * from course;

查询得到的结果集:

2.转换

方法一:

select name ,
sum(case when course = '语文' then score end ) as 语文,
sum(case when course = '数学' then score end ) as 数学,
sum(case when course = '物理' then score end ) as 物理
from course group by name

得到的结果集:

 方法二:

select pvt.name as '姓名',pvt.语文,pvt.数学,pvt.物理
from course 
pivot(max(score) for course in (语文,数学,物理))pvt

 

 

附加:PIVOT的使用格式:

select ...

from <source_table> --源表或表达式

PIVOT

(

agg_func() ————聚合操作

FOR <spreading_element> ----扩展元素

IN(spreading_columns) -----扩展列名称(扩展元素的值)

)as <table_alias> ——为PIVOT结果指定列名

--按照上面的格式编写
select pvt.name as '姓名',pvt.语文,pvt.数学,pvt.物理
from course 
pivot
(
max(score) 
for course  --这个是课程字段
in (语文,数学,物理)
) pvt

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值