去了一家公司进行面试,给了一个行列转换的问题:
列转行
将【题目所用表格】变成【模板要求】中表格的样子
题目表格:
模板要求:
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