目录
[成绩单 简单互转](#成绩单 简单互转)
[多行转多列 分组 判断 聚合](#多行转多列 分组 判断 聚合)
[理解 分组 合并](#理解 分组 合并)
[逆向需求 多列转多行 输出 合并](#逆向需求 多列转多行 输出 合并)
[abc 去重 合并 拆分](#abc 去重 合并 拆分)
[逆向需求 多列转多行](#逆向需求 多列转多行)
[拆分 按长度](#拆分 按长度)
[拆分 按个数](#拆分 按个数)
成绩单简单互转
需求
多行转多列 分组 判断 聚合
sql
with tmp as(-- 分组,只输出语文 其他是0 ==> 条件判断,聚合
select
s_id,
sum(if(c_id = '01',score,0)) '语文01',
sum(if(c_id = '02',score,0)) '数学02',
max(if(c_id = '03',score,0)) '英语03',
sum(score) sum_score
from score
group by s_id
)
select -- 输出格式
*,
dense_rank() over(order by sum_score desc) dr -- 窗口范围 0-当前行
from tmp;
理解 分组 合并
sql
select
s_id, -- 分组:右侧括号图 多行
group_concat(c_id) c_id, -- 多行合并成一行字符串 有空则空
group_concat(score) score,
group_concat(if(c_id = '01',score,0)) '语文01',
group_concat(if(c_id = '01',score,0)) '数学02',
group_concat(if(c_id = '01',score,0)) '英语03'
from score
group by s_id;
逆向需求 多列转多行 输出 合并
sql
with tmp as(
with tmp as(-- 分组:右侧括号图,只输出语文 其他是0 ==> 条件判断,聚合
select
s_id,
sum(if(c_id = '01',score,0)) '语文01',
sum(if(c_id = '02',score,0)) '数学02',
max(if(c_id = '03',score,0)) '英语03',
sum(score) sum_score
from score
group by s_id
)
select -- 输出格式
*,
dense_rank() over(order by sum_score desc) dr -- 窗口范围 0-当前行
from tmp
)
select s_id,'01' c_id,语文01 score from tmp union -- 输出需要的列 合并
select s_id,'02' c_id,数学02 score from tmp union
select s_id,'03' c_id,英语03 score from tmp;
abc 去重 合并 拆分
需求
建表
sql
create table abc(
a int comment '年份',
b varchar(2) comment '字母',
c int comment '整数'
) comment '行列互转 合并拆分';
insert into abc
values
('2014','A',10),
('2014','B',9),
('2014','B',6),
('2015','A',8),
('2015','B',7);
select * from abc;
多行转多列
sql
with tmp as(-- b去重
select
a,b,group_concat(c) c
from abc
group by a,b
)
select
a,
sum(if(b = 'A',c,0)) col_A,
max(if(b = 'B',c,0)) col_B -- 字符串和整数聚合 只能max
from tmp
group by a;
逆向需求 多列转多行
拆分 按长度
sql
with tmp as(-- 作为初始表
with tmp as(
select
a,b,group_concat(c) c
from abc
group by a,b
)
select
a,
sum(if(b = 'A',c,0)) col_A,
max(if(b = 'B',c,0)) col_B -- 字符串和整数聚合 只能max
from tmp
group by a
)
select a,'A' b,col_A c from tmp union -- 输出需要的列 重命名
select a,'B' b,substring(col_B,1,1) c from tmp union -- 去重
select a,'B' b,substring(col_B,-1,1) c from tmp
order by a;
拆分 按个数
sql
with tmp as(-- 作为初始表
with tmp as(
select
a,b,group_concat(c) c
from abc
group by a,b
)
select
a,
sum(if(b = 'A',c,0)) col_A,
max(if(b = 'B',c,0)) col_B -- 字符串和整数聚合 只能max
from tmp
group by a
)
select a,'A' b,col_A c from tmp union
select a,'B' b,substring_index(col_B,',',1) c from tmp union
select a,'B' b,substring_index(col_B,',',-1) c from tmp
order by a;