iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >SQL四种方法实现行列转换超详细
  • 775
分享到

SQL四种方法实现行列转换超详细

sql数据库mysql 2023-08-18 15:08:19 775人浏览 安东尼
摘要

前言 大家好,我是楚生辉,在未来的日子里我们一起来学习大数据sql相关的技术,一起努力奋斗,遇见更好的自己! 本文详细的介绍了多个方法实现列转行,行转列,并提供了案例的材料,有需要的小伙伴可以自行获取与学习~ 数据准备 CREAT

前言

大家好,我是楚生辉,在未来的日子里我们一起来学习大数据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')) tGROUP BY id

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

SELECT id, 'MATH' subject, MATH score FROM products WHERE MATH IS NOT NULLUNIONSELECT id, 'ENGLISH' subject, ENGLISH score FROM products WHERE ENGLISH IS NOT NULLUNIONSELECT 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 

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ在这里插入图片描述

来源地址:https://blog.csdn.net/m0_61532500/article/details/126677094

您可能感兴趣的文档:

--结束END--

本文标题: SQL四种方法实现行列转换超详细

本文链接: https://www.lsjlt.com/news/374286.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL四种方法实现行列转换超详细
    前言 大家好,我是楚生辉,在未来的日子里我们一起来学习大数据SQL相关的技术,一起努力奋斗,遇见更好的自己! 本文详细的介绍了多个方法实现列转行,行转列,并提供了案例的材料,有需要的小伙伴可以自行获取与学习~ 数据准备 CREAT...
    99+
    2023-08-18
    sql 数据库 mysql
  • sql行列转换的方法是什么
    在SQL中,可以使用PIVOT和UNPIVOT来实现行列转换,具体方法如下: PIVOT:将行数据转换为列数据。使用PIVOT时,...
    99+
    2024-04-09
    sql
  • Java 列表转换为数组的3种详细方法介绍
    1.介绍 List 接口提供了一种存储有序集合的方法。它是 Collection 的子接口。它是一个有序的对象集合,其中可以存储重复值。由于 List 保留了插入顺序,因此它允许元素的位置访问和插入。...
    99+
    2023-09-22
    java jvm 开发语言
  • sql实现列转行的方法是什么
    在SQL中,可以使用UNPIVOT操作符来实现列转行的功能。UNPIVOT操作符可以将多个列转换为行,将多个列的值转换为行的值,并将...
    99+
    2024-04-15
    sql
  • 在doris中实现行转列操作的三种方式及列转行的实现
    本文演示使用sql进行列转行的操作和列转行 一、行转列 创建表 drop table score_1;CREATE TABLE IF NOT EXISTS score_1(    `user_id` BIGINT NOT NULL...
    99+
    2023-09-14
    数据库 mysql
  • mysql实现行转列的方法
    这篇文章主要介绍mysql实现行转列的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql实现行转列的方法:1、用cross join的方式实现,代码为【cross join...
    99+
    2024-04-02
  • Mybatis实现传入多个参数的四种方法详细讲解
    目录一、Mybatis四种传递多个参数的方式1)参数索引2)@Param3)Map集合4)POJO实体类一、Mybatis四种传递多个参数的方式 XML文件或者注解中都通过#{}获取...
    99+
    2023-01-28
    Mybatis传入多个参数 Mybatis传入参数
  • (超详细)vue怎么进行路由跳转?三种方式分享
    步骤 (7步法 ):1、下载vue-router模块到当前工程 yarn add vue-router2、在main.js中引入VueRouter函数// 引入路由 import VueRouter from "vue-route...
    99+
    2023-05-14
    路由跳转 Vue
  • SQL Server如何使用PIVOT与unPIVOT实现行列转换
    这篇“SQL Server如何使用PIVOT与unPIVOT实现行列转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2023-06-30
  • 详解C/C++实现各种字符转换方法合集
    目录一、std::string 和 std::wstring 互转1、直接声明std::wstring2、wstring_convert3、WideCharToMultiByte和M...
    99+
    2024-04-02
  • uniapp中实现换行替换的几种方法
    在进行uniapp开发的时候,我们常常需要对文字的显示做一些特殊的处理。其中一个常见的问题是如何实现换行替换。在这篇文章中,我们将介绍uniapp中实现换行替换的几种方法。使用正则表达式首先,我们可以使用正则表达式来进行换行替换。具体的代码...
    99+
    2023-05-14
  • SQL Server中怎么使用Pivot和UnPivot实现行列转换
    这篇“SQL Server中怎么使用Pivot和UnPivot实现行列转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-06-28
  • js字符串转json对象的四种实现方法
    目录1. javascript函数eval()2. 浏览器自带对象JSON,JSON.parse()3. jQuery插件,$.parseJSON()4. aja...
    99+
    2023-05-16
    js字符串转json对象数组 js 字符串转json对象 js转换json数据
  • 详解Python实现字典合并的四种方法
    目录1、用for循环把一个字典合并到另一个字典2、用dict(b, **a)方法构造一个新字典3、用b.update(a)的方法,更新字典4、把字典转换成列表合并后,再转换...
    99+
    2024-04-02
  • JavaScript数组实现扁平化四种方法详解
    目录1. 常规递归法2. reduce方法3. 扩展运算符实现4. split和toString共同处理数组的扁平化就是将一个嵌套多层的数组 array(嵌套可以是任何层数)转换为只...
    99+
    2022-11-13
    JS数组扁平化 JS数组
  • C++超详细讲解隐藏私有属性和方法的两种实现方式
    目录例子用抽象类解决问题用Pimpl风格解决问题总结参考在我们编写程序的时候,会将程序模块化,常见的就是用动态链接库的方式,然后导出函数接口或者类。而对于导出类的方式,作为模块的实现...
    99+
    2024-04-02
  • C#实现Word转换TXT的方法详解
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-22
    C# Word转TXT C# Word TXT
  • 如何使用CSS实现换行(三种方法)
    换行是指在文字或者其他内容到达行末时,自动转到下一行的行为。在网页设计中,正确的换行可以使页面看起来更加舒适和自然。在CSS中,实现正确的换行需要了解一些原理和技巧。本文将为您介绍如何使用CSS实现换行的几种方法。方法一:使用word-wr...
    99+
    2023-05-14
  • Java实现Excel转PDF的两种方法详解
    目录一、使用spire转化PDF1、使用spire将整个Excel文件转为PDF2、指定单个的sheet页转为PDF二、使用jacob实现Excel转PDF(推荐使用)1、环境准备2...
    99+
    2024-04-02
  • css实现禁止换行并超出隐藏的方法
    小编给大家分享一下css实现禁止换行并超出隐藏的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!css实现禁止换行并超出隐藏的方法:首先创建一个HTML示例文件...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作