返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQL中如何将行转成列详解
  • 583
分享到

SQL中如何将行转成列详解

sql怎样将列转为行sql 行列转换sql语句行转列 2022-11-13 19:11:36 583人浏览 安东尼
摘要

目录sql中怎么将行转成列?1. 使用 CASE…WHEN…THEN 语句实现行转列,参考如下代码:2. 使用 IF() 函数实现行转列,参考如下代码:补

天天这需求就神奇!!!!

SQL中怎么将行转成列?

我们以Mysql数据库为例,来说明行转列的实现方式。

首先,假设我们有一张分数表(tb_score),表中的数据如下图:

然后,我们再来看一下转换之后需要得到的结果,如下图:

可以看出,这里行转列是将原来的subject字段的多行内容选出来,作为结果集中的不同列,并根据userid进行分组显示对应的score。通常,我们有两种方式来实现这种转换。

1. 使用 CASE…WHEN…THEN 语句实现行转列,参考如下代码:

SELECT userid, 
SUM(CASE `subject` WHEN '语文' THEN score ELSE 0 END) as '语文', 
SUM(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学', 
SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语', 
SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治' 
FROM tb_score 
GROUP BY userid

注意,SUM() 是为了能够使用GROUP BY根据userid进行分组,因为每一个userid对应的
subject="语文"的记录只有一条,所以SUM() 的值就等于对应那一条记录的score的值。假如userid ='001' and subject='语文' 的记录有两条,则此时SUM() 的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个user对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

2. 使用 IF() 函数实现行转列,参考如下代码:

SELECT userid, 
SUM(IF(`subject`='语文',score,0)) as '语文', 
SUM(IF(`subject`='数学',score,0)) as '数学', 
SUM(IF(`subject`='英语',score,0)) as '英语', 
SUM(IF(`subject`='政治',score,0)) as '政治' 
FROM tb_score 
GROUP BY userid

注意, IF(subject='语文',score,0) 作为条件,即对所有subject='语文’的记录的score字段进行SUM()、MAX()、MIN()、AVG()操作,如果score没有值则默认为0。

补充:列转行:union

列转行是上述过程的逆过程,所以其思路也比较直观:

  • 行记录由一行变为多行,列字段由多列变为单列;
  • 一行变多行需要复制,列字段由多列变单列相当于是堆积的过程,其实也可以看做是复制;
  • 一行变多行,那么复制的最直观实现当然是使用union,即分别针对每门课程提取一张衍生表,最后将所有课程的衍生表union到一起即可,其中需要注意字段的对齐

按照这一思路,给出SQL实现如下:

SELECT uid,      
		sum(if(course='语文', score, NULL)) as `语文`,      				sum(if(course='数学', score, NULL)) as `数学`,      				sum(if(course='英语', score, NULL)) as `英语`,      				sum(if(course='物理', score, NULL)) as `物理`,      
		sum(if(course='化学', score, NULL)) as `化学`FROM scoreLongGROUP BY uid

查询结果当然是预期的长表。这里重点解释其中的三个细节:

在每个单门课的衍生表中,例如这句:SELECT uid, ‘语文’ as course, 语文 as score,用单引号包裹起来的课程名称是字符串常量,比如语文课的衍生表中的课程名都叫语文,然后将该列命名为course;第二个用反引号包裹起来的课程名实际上是从宽表中引用这一列的取值,然后将其命名为score。

这实际上对应的一个知识点是:在SQL中字符串的引用用单引号(其实双引号也可以),而列字段名称的引用则是用反引号.

上述用到了where条件过滤成绩为空值的记录,这实际是由于在原表中存在有空值的情况,如不加以过滤则在本例中最终查询记录有10条,其中两条记录的成绩字段为空

最后,本例中用union关键字实现了多表的纵向拼接,实际上用union all更为合理,二者的区别是union会完成记录去重;而union all则简单的拼接,在确定不存在重复或无需去重的情况下其效率更高。

总结

到此这篇关于SQL中如何将行转成列的文章就介绍到这了,更多相关SQL将行转成列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SQL中如何将行转成列详解

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

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

猜你喜欢
  • SQL中如何将行转成列详解
    目录SQL中怎么将行转成列?1. 使用 CASE…WHEN…THEN 语句实现行转列,参考如下代码:2. 使用 IF() 函数实现行转列,参考如下代码:补...
    99+
    2022-11-13
    sql怎样将列转为行 sql 行列转换 sql语句行转列
  • SQL行转列与列转行详情
    1.数据集 +---+----------+ |id |login_date| +---+----------+ |01 |2021-02-28| |01 |2021-03-01| ...
    99+
    2024-04-02
  • SQL如何实现行转列和列转行
    这篇文章给大家分享的是有关SQL如何实现行转列和列转行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。行列互转,是一个经常遇到的需求。实现的方法,有case when方式和2005...
    99+
    2024-04-02
  • 【转】SQL Server将一列拆分成多列
    数据表中有一列数据,如图1所示: 图1数据表 现在需要将该列数据分成三列。 SQL 代码如下所示: 1、 select  max(case when F1%3=1 then F1 else 0 end) a,max(case w...
    99+
    2014-08-23
    【转】SQL Server将一列拆分成多列 数据库入门 数据库基础教程 数据库 mysql
  • sql中如何实现列转行
    sql中实现列转行的操作有两种方式:使用 union 操作符通过垂直合并查询结果实现列转行。使用 pivot 函数将列数据转换为行数据,其中 pivot 函数的语法为:pivo...
    99+
    2024-06-06
    聚合函数
  • 如何进行SQL中PIVOT行列转换
    这篇文章主要讲解了“如何进行SQL中PIVOT行列转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何进行SQL中PIVOT行列转换”吧!PIVOT通过将...
    99+
    2024-04-02
  • pandas如何优雅的列转行及行转列详解
    目录一、列转行1、背景描述2.方法描述2.1 方法12.2 方法22.3 方法32.4 方法43 思考与总结4 思维延伸4.1 例子14.2 例子2二、行转列1.准备数据2.行转列实...
    99+
    2024-04-02
  • sql将行转列的方法有哪些
    在SQL中,可以使用以下方法将行转列:1. 使用CASE语句:- 使用多个CASE语句,每个语句对应一个要转置的列,并使用不同的条件...
    99+
    2023-10-12
    sql
  • Python如何将数字转化成列表
    小编给大家分享一下Python如何将数字转化成列表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. digitizedef digitize(n):  return list(ma...
    99+
    2023-06-25
  • SQL中如何实现行转列Pivot函数
    这篇文章将为大家详细讲解有关SQL中如何实现行转列Pivot函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先来创建一个DailyIncome 表create ...
    99+
    2024-04-02
  • 怎么在SQL中实现行转列和列转行
    怎么在SQL中实现行转列和列转行?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。行列转换就是如下图所示两种展示形式的互相转换行转列假如我们有...
    99+
    2024-04-02
  • sql语句如何实现行转列
    这篇文章将为大家详细讲解有关sql语句如何实现行转列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查...
    99+
    2024-04-02
  • Python中xlsx文件转置操作详解(行转列和列转行)
    目录1.原始数据是这样的2.脚本如下:3.运行脚本后生成的xlsx文件,如下:附:pivot方法即可完成行转列哦总结1.原始数据是这样的 2.脚本如下: import pandas...
    99+
    2024-04-02
  • SQL Server中怎么将行数据转换为列数据
    今天就跟大家聊聊有关SQL Server中怎么将行数据转换为列数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。准备工作创建表use [t...
    99+
    2024-04-02
  • 怎么使用SQL语句将行和列进行转换
    小编给大家分享一下怎么使用SQL语句将行和列进行转换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  如何使用SQL语句将行和列...
    99+
    2024-04-02
  • SQL Server中怎么将一列的多行内容拼接成一行
    今天就跟大家聊聊有关SQL Server中怎么将一列的多行内容拼接成一行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。昨天遇到一个SQL Serve...
    99+
    2024-04-02
  • python如何将单词列表排成一行
    这篇文章将为大家详细讲解有关python如何将单词列表排成一行,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。将单词列表排成一行这与上一个过程相反。 在这一部分中,我们将使用join函数将单词列表转换为单行...
    99+
    2023-06-27
  • php如何将中文转成byte
    这篇文章给大家分享的是有关php如何将中文转成byte的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php将中文转成byte的方法:1、创建一个PHP示例文件;2、通过“function stringToByte...
    99+
    2023-06-25
  • MySQL中列如何以逗号分隔转成多行
    目录mysql列以逗号分隔转成多行场景解决方案总结MySQL列以逗号分隔转成多行 业务场景: 在数据库中,有一张的一个字段存储方式是采用以逗号分隔存储多个值,现在需要将其进行拆分成多个独立的值,与另外一张字典表进行关联,...
    99+
    2023-02-07
    MySQL逗号分隔 MySQL逗号分隔多行 MySQL逗号
  • SQL 如何实现动态的行列转置
    Oracle 和新版 Mysql 里有 pivot 实现行列转置,但实际处理数据时,会碰到一些更复杂的转置情况,pivot 也搞不定,比如: 想转置成: 这个难点在于事先不知道有多少种收入来源,而且每个人的收入来源种类各不相同。...
    99+
    2015-04-20
    SQL 如何实现动态的行列转置
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作