mysql高级查询实例:行列转换一行多行转换

Posted 小磊要努力哟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql高级查询实例:行列转换一行多行转换相关的知识,希望对你有一定的参考价值。

想看更多的高级查询语句,可以看我之前的高阶常用函数超详细总结,真的,看完,你就学会80%的高级查询语法了。
传送门:
万字掌握mysql常用函数

一、行列转换

有些人听到可能会想到就是把第n行转为第n列,说的也不是没什么道理,但在SQL语句查询中,并非这样。行列转换是企业面试中经常会遇到的一大考点,那SQL中的行列转换到底是什么呢?相信大家看到下面的图片就明白了。

1、行转列:聚合函数+CASE WHEN / IF()语句

'''思路:
1、行转列明显行数减少了并且对姓名进行了去重,因此首先对姓名进行分组;
2、分组后返回的是姓名及三科分数,每科分数相对应一列,因此利用聚合函数和控制函数条件筛选,当subject=语文时返回语文成绩,subject=数学时返回数学成绩 ,subject=语英语时返回英语成绩 
'''
select name
      ,max(case when subject = '语文' then score end) as `语文`
	  ,max(case when subject = '数学' then score end) as `数学`
	  ,max(case when subject = '英语' then score end) as `英语`
from stu_score1 
group by name 

2、列转行:union

'''思路:
列转行就是把所有属性一样的某些列转为同一列,行数增加;我们可以先把语文成绩、数学成绩、英语成绩分别的筛选出来,再纵向连接。
'''
select name,'语文' as subject, 语文 as score from stu_score2
union 
select name,'数学' as subject, 数学 as score from stu_score2
union 
select name,'英语' as subject, 英语 as score from stu_score2
  • MYSQL的列转行目前我也只会这一种方法,如果有更好更方便的可以私信或留言哦。
  • Hive语句中有自己独有的行列转换语句,大家有兴趣可以学习学习。

二、一行多行转换

  • 看起来其实和行列转换是差不多的,只是这里并没有考虑到其他值,更像是分组后的字符串连接。

1、一行变多行:

select name,substring_index(concat_sub,',',1) as subject 
from stu_score3 
union
select name,substring_index(concat_sub,',',-1) as subject 
from stu_score3 
union
select name,substring_index(substring_index(concat_sub,',',2),',',-1) as subject 
from stu_score3 
 这里讲一下substring_index(字符串,分隔符,分割符索引n)函数
若n>0,则输出第n个分隔符之前的所有字符;
若n<0,将字符串从后往前看,则输出倒数第n个分隔符之后的所有字符。
例如:
substring_index('a,b,c,d,e', ',' , 2) 输出第二个分隔符前的所有字符 a,b
substring_index('a,b,c,d,e', ',' , -2)输出倒数第二个分隔符后的所有字符 d,e

2、多行变一行

# 由图可以看出,将name列分组后的subject列连接,字符串分组连接函数用group_concat()函数
select name
      ,group_concat(subject) as concat_sub  # 默认','分割字符
	  ,group_concat(subject SEPARATOR ';') con_sub # 指定';'分割字符
from stu_score1
group by name

以上是关于mysql高级查询实例:行列转换一行多行转换的主要内容,如果未能解决你的问题,请参考以下文章

C#将查询返回的数据(一行多列)怎么转换成一列多行dataTable?

Excel或SQL Sserver中数据行列转置/转换?

Oracle 行列转换总结

在oracle中将多行列转换为一行列

MySQL# 自定义变量一行数据与多行的转换IF函数

MySQL# 自定义变量一行数据与多行的转换IF函数