前言

大家好,我是楚生辉,在未来的日子里我们一起来学习大数据SQL相关的技术,一起努力奋斗,遇见更好的自己!

本文详细的介绍了多个方法实现列转行,行转列,并提供了案例的材料,有需要的小伙伴可以自行获取与学习~

  • 数据准备
 CREATE TABLE `score` (`id` varchar(255),`subject` char(10),`score` int) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 insert  into `score`(`id`,`subject`,`score`) values ('1','MATH',90),('1','ENGLISH',98),('1','CHINESE',85),('2','MATH',87),('2','ENGLISH',78),('2','CHINESE',89);

ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

1.使用join拼接

 SELECT id,score as 'MATH' FROM score WHERE subject = 'MATH';

我们把其他几门科目的成绩查出来后当做临时表再使用join不就解决了该问题吗?!而连接条件便是std。看到这,大家可以自己试一试。完整代码如下:

SELECT * FROM( SELECT id, score AS 'MATH' FROM score WHERE subject = 'MATH' ) AS t1JOIN ( SELECT id, score FROM score WHERE subject = 'ENGLISH' ) AS t2 ON t1.id = t2.idJOIN ( SELECT id, score FROM score WHERE subject = 'CHINESE' ) AS t3 ON t1.id = t3.id

ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
然后我们只需要对上述的结果,挑选出我们想要的数据即可

SELECT t1.id, t1.MATH, t2.score AS 'ENGLISH',t3.score AS 'CHINESE' FROM( SELECT id, score AS 'MATH' FROM score WHERE subject = 'MATH' ) AS t1JOIN ( SELECT id, score FROM score WHERE subject = 'ENGLISH' ) AS t2 ON t1.id = t2.idJOIN ( SELECT id, score FROM score WHERE subject = 'CHINESE' ) AS t3 ON t1.id = t3.id

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

2.自然拼接

自动的寻找2表中的(所有)同名且属性相同的列作为连接条件。使用natural join子句来完成。
例如:A表中有列a,b,c,d B表中有a,b,x,z
自然连接会将A.a=B.a and A.b=B.b 作为连接条件
select * from A natural join B (natural 不可以省略)。他们所得的结果中,同名且属性相同的字段只显示一个。

对于自然连接而言,连接两个table之后,两个table共用的属性就会合并在一起。如果连个table没有共有的属性,则进行笛卡尔乘积,也就是进行两两相乘,如果table 1有3行,table 2有4行,自然连接后就有12行。自然连接的语法如下:

SELECT * FROM( SELECT id, score AS 'MATH' FROM score WHERE subject = 'MATH' ) AS t1NATURAL JOIN ( SELECT id, score AS 'ENGLISH' FROM score WHERE SUBJECT = 'ENGLISH' ) AS t2NATURAL JOIN ( SELECT id, score AS 'CHINESE' FROM score WHERE SUBJECT = 'CHINESE' ) AS t3

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

3.使用union拼接

union:会将两个结果集进行并集处理,不包括重复的行;
union all:对两个结果集进行并集处理,包括重复行。

日常开发中,能使用union all就使用union all

SELECT id,score AS 'MATH',0 AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'MATH';

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

(SELECT id,score AS 'MATH',0 AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'MATH')
UNION ALL
(SELECT id,0 AS 'MATH',score AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'ENGLISH')
UNION ALL
(SELECT id,0 AS 'MATH',0 AS 'ENGLISH',score AS 'CHINESE' FROM score WHERE subject = 'CHINESE');

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

此时,我们发现目前的sql查询出来会有很多重复的行,但由于其他科目没有的数据都是0,我们可以根据id进行分组,然后sum()聚合相加一下,这样就能得到我们想要的结果

select id,SUM(MATH) AS 'MATH',SUM(ENGLISH) AS 'ENGLISH',SUM(CHINESE)AS CHINESE from (
(SELECT id,score AS 'MATH',0 AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'MATH')
UNION ALL
(SELECT id,0 AS 'MATH',score AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'ENGLISH')
UNION ALL
(SELECT id,0 AS 'MATH',0 AS 'ENGLISH',score AS 'CHINESE' FROM score WHERE subject = 'CHINESE')) t
GROUP BY id

以上都是列转行,反过来思路也大致一样就可以实现从行转列

SELECT id, 'MATH' subject, MATH score FROM products WHERE MATH IS NOT NULL
UNION
SELECT id, 'ENGLISH' subject, ENGLISH score FROM products WHERE ENGLISH IS NOT NULL
UNION
SELECT id, 'CHINESE' subject, CHINESE score FROM products WHERE CHINESE IS NOT NULL;

4.经典sum+if

思路:由多行变为一行,自然而然的就要想要对id进行groupby聚合,在此基础上,我们还需要根据课程名词去筛选课程成绩,因此还需要再添加一个if函数作为筛选(用case when)也可以,如果if符合条件,就设置本课程的分数,如果不符合条件,就设置为null,最后我们再通过一个sum聚合函数提取成绩即可

SELECT id,  if(subject='MATH', score, NULL) as `MATH`,  if(subject='ENGLISH', score, NULL) as `ENGLISH`, if(subject='CHINESE', score, NULL) as `CHINESE`
FROM score

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

该步骤与上面union中自己设置0有异曲同工之妙,只不过这一次是通过if判断自动的设置为null,我们只需要在此基础上,对id进行分组,再添加一个sum聚合一下就可以实现我们的需求

SELECT id,  sum(if(subject='MATH', score, NULL)) as `MATH`,  sum(if(subject='ENGLISH', score, NULL)) as `ENGLISH`, sum(if(subject='CHINESE', score, NULL)) as `CHINESE`
FROM score
GROUP BY id

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

SQL四种方法实现行列转换超详细相关推荐

  1. 图片怎么转换成文字?这四种方法分分钟完成转换

    怎么将图片转换成文字呢?通过图片转文字的方式,文本内容更容易编辑和搜索.传统上,我们需要手动输入文本内容,这是一项耗时且费力的工作,但通过图片转文字,我们可以自动将图片中的文字提取出来,然后进行编辑和 ...

  2. Spark SQL DataFrame新增一列的四种方法

    Spark SQL DataFrame新增一列的四种方法 方法一:利用createDataFrame方法,新增列的过程包含在构建rdd和schema中 方法二:利用withColumn方法,新增列的过 ...

  3. Javadoc转换chm帮助文档的四种方法总结

    使用jd2chm.exe方式无法完成,不晓得为什么. 所以用的javadoc2chm 方式,但是chm文档开头AllClass乱码, 用chmeditor修改就可以了 点击Files 下的工具类文档. ...

  4. java连接sql server2008_java连接sql-server-2008的四种方法

    <java连接sql-server-2008的四种方法>由会员分享,可在线阅读,更多相关<java连接sql-server-2008的四种方法(11页珍藏版)>请在人人文库网上 ...

  5. 一文搞定最大公约数(四种方法,赋原理和比较,超详细解答)

    最大公约数 前言 1.暴力穷举法 代码 2.辗转相除法 步骤 原理 代码 3.更相减损法 步骤 原理 代码 比较 4.stein算法 比较 运算符 & 移位操作符 原理 步骤 代码 前言 求两 ...

  6. 使用Spring Security3的四种方法概述

    使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...

  7. python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍

    本篇文章给大家带来的内容是关于Python中实现机器学习功能的四种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用S ...

  8. 【数论】求组合数的四种方法

    组合数的常用公式 零.纯暴力法 根据第一个公式,将的分子和分母求出,再相除即可. 适用范围:n,m较小的情况下. 时间复杂度: 第一种部分代码如下: for(int i = n; i >= n ...

  9. 在js中加html_在HTML文档中嵌入JavaScript的四种方法

    在HTML里嵌入JavaScript 在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内嵌,放置在标签之间  (少): 2.放置在有 3.放置自HTML事件处理程序中,该事件处理程 ...

  10. python写错了怎么更改-Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

最新文章

  1. 世界人口钟实时数据_用数字孪生重新定义智慧城市,美象VR推出MxDATA智慧城市CIM数据可视化平台...
  2. OpenCV gapi模块基本API的实例(附完整代码)
  3. poj2823 Sliding Window
  4. 一个讨论:SAP项目实施的顾问,需要花时间去调试代码了解技术细节吗
  5. java本地可以发到linux不行,java 使用 ftp 在windows环境下可以正常下载文件,在linux环境下不行...
  6. jmeter xml 请求_Jmeter学习笔记(十六)——HTTP请求之content-type
  7. Redis解决秒杀中的超卖问题
  8. python辗转相除法求最小公倍数_Python实现利用最大公约数求三个正整数的最小公倍数示例...
  9. 【原创】C#控件TreeView与数据库的操作
  10. .bat脚本基本命令合集
  11. matlab系统稳定性仿真实验,基于Matlab的电力系统暂态稳定仿真实验与分析
  12. 成都互联网公司和生活成本
  13. u3d学习-第一个小游戏
  14. MT6589下载工具,MT6589刷机工具
  15. 想在社会上混 就记住这20句
  16. cobol学习4--语法与文法(2)
  17. 论文笔记-2019-ImageNet-trained CNNs are biased towards texture; increasing shape bias improves accuracy
  18. 给UILable中的文字添加删除线样式
  19. android 重力感应 横竖屏切换,重力感应 横竖屏切换
  20. hibernate中PO的构造器顺序

热门文章

  1. Tcl学习2——Tcl语言语法
  2. 红巨星视频调色AE插件 Red Giant Magic Bullet Suite 16.0.0 WIN
  3. ARINC429协议芯片DEI1016工作原理
  4. 测试页能打印 软件不能打,打印机可以打印测试页不能打印文档怎么处理
  5. 高通QCA9531 2.4GHz电梯监控无线CPE
  6. 基于JAVA教务排课系统计算机毕业设计源码+数据库+lw文档+系统+部署
  7. 动态壁纸安卓_高清无水印!这4款壁纸软件,让你的手机好看又独特
  8. 清明上河图30亿像素_清明上河图全图下载
  9. 快速搭建pgadmin4环境
  10. TCP通讯知识点总结