iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql的行如何转为列
  • 539
分享到

mysql的行如何转为列

2024-04-02 19:04:59 539人浏览 独家记忆
摘要

这篇“Mysql的行如何转为列”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql的行

这篇“Mysql的行如何转为列”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql的行如何转为列”文章吧。

mysql行转列的方法:1、利用“SUM(CASE 表名 WHEN 字段名 THEN score ELSE 0 END) as 字段名”操作转换;2、利用“SUM(IF(表名=字段名,score,0)) as 字段名”操作转换。

教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。

mysql的行怎么转为列

行转列

即将原本同一列下多行的不同内容作为多个字段,输出对应内容。

建表语句

DROP TABLE IF EXISTS tb_score;
CREATE TABLE tb_score(
    id INT(11) NOT NULL auto_increment,
    userid VARCHAR(20) NOT NULL COMMENT '用户id',
    subject VARCHAR(20) COMMENT '科目',
    score DOUBLE COMMENT '成绩',
    PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

插入数据

INSERT INTO tb_score(userid,subject,score) VALUES ('001','语文',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','数学',92);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','英语',80);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','语文',88);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','数学',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','英语',75.5);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','语文',70);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','数学',85);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','英语',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','政治',82);

查询数据表中的内容(即转换前的结果)

SELECT * FROM tb_score

先来看一下转换后的结果:

mysql的行如何转为列

可以看出,这里行转列是将原来的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

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

注意点:

(1)SUM() 是为了能够使用GROUP BY根据userid进行分组,因为每一个userid对应的subject="语文"的记录只有一条,所以SUM() 的值就等于对应那一条记录的score的值。

假如userid ='001' and subject='语文' 的记录有两条,则此时SUM() 的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个user对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

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

3、利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL将汇总行标题显示为Total

SELECT IFNULL(userid,'total') AS 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 政治,
SUM(IF(`subject`='total',score,0)) AS total
FROM(
    SELECT userid,IFNULL(`subject`,'total') AS `subject`,SUM(score) AS score
    FROM tb_score
    GROUP BY userid,`subject`
    WITH ROLLUP
    HAVING userid IS NOT NULL
)AS A 
GROUP BY userid
WITH ROLLUP;

运行结果:

mysql的行如何转为列

4、利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total

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 政治,
SUM(score) AS TOTAL 
FROM tb_score
GROUP BY userid
UNION
SELECT 'TOTAL',SUM(IF(`subject`='语文',score,0)) AS 语文,
SUM(IF(`subject`='数学',score,0)) AS 数学,
SUM(IF(`subject`='英语',score,0)) AS 英语,
SUM(IF(`subject`='政治',score,0)) AS 政治,
SUM(score) FROM tb_score

运行结果:

mysql的行如何转为列

5、利用SUM(IF()) 生成列,直接生成结果不再利用子查询

SELECT IFNULL(userid,'TOTAL') AS 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 政治,
SUM(score) AS TOTAL 
FROM tb_score
GROUP BY userid WITH ROLLUP;

运行结果:

mysql的行如何转为列

6、动态,适用于列不确定情况

SET @EE='';
select @EE :=CONCAT(@EE,'sum(if(subject= \'',subject,'\',score,0)) as ',subject, ',') AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ;
SET @QQ = CONCAT('select ifnull(userid,\'TOTAL\')as userid,',@EE,' sum(score) as TOTAL from tb_score group by userid WITH ROLLUP');
-- SELECT @QQ;
PREPARE stmt FROM @QQ;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

运行结果:

mysql的行如何转为列

7、合并字段显示:利用group_concat()

SELECT userid,GROUP_CONCAT(`subject`,":",score)AS 成绩 FROM tb_score
GROUP BY userid

运行结果:

mysql的行如何转为列

group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。

比较抽象,难以理解。通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。

结论:group_concat()函数可以很好的建属于同一分组的多个行转化为一个列。

以上就是关于“mysql的行如何转为列”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: mysql的行如何转为列

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

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

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

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

下载Word文档
猜你喜欢
  • mysql的行如何转为列
    这篇“mysql的行如何转为列”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql的行...
    99+
    2024-04-02
  • 学习mysql 如何行转列与列传行
    目录一、行转列—case+groupby二、列转行——union一、行转列— case+group by mysql>...
    99+
    2024-04-02
  • mysql行数据转为列数据
    最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。 借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用。 ...
    99+
    2023-09-02
    mysql oracle 数据库
  • mysql 行转列
    以下是其中比较常见的几种方法: 使用GROUP_CONCAT函数 可以使用GROUP_CONCAT函数将多行数据合并为一行,并以逗号或其他分隔符进行分隔。通过SELECT语句和GROUP BY子句,可以将数据行转换为列。具体语法如下...
    99+
    2023-08-20
    mysql 数据库 sql
  • mysql 列转行
    一、列转行 mysql 数据库中,我们可能遇到将数据库中某一列的数据(多个值,按照英文逗号分隔),转化为多行数据(即一行转多行),然后join关联表,再转化为一行数据 如:有两张表,一用户表,一张学科表,需要查询学科表中的用户姓名 用...
    99+
    2023-08-31
    mysql 数据库 sql
  • SQL如何实现行转列和列转行
    这篇文章给大家分享的是有关SQL如何实现行转列和列转行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。行列互转,是一个经常遇到的需求。实现的方法,有case when方式和2005...
    99+
    2024-04-02
  • MySQL中的经典面试题——行转列(列转行)
    目录 1、简介:   1. 行转列(Pivot): 2. 列转行(Unpivot): 2、行转列,列转行的思想 3、实现 3.1、实现行转列 3.2、总结(行转列)实现的两种方法   3.3、实现(列转行)  3.4、...
    99+
    2023-10-01
    mysql 数据库 sql
  • mysql行转列和列转行的方法是什么
    在MySQL中,行转列和列转行通常使用以下方法来实现: 使用聚合函数和CASE语句进行行转列操作: SELECT ...
    99+
    2024-04-09
    mysql
  • pandas如何优雅的列转行及行转列详解
    目录一、列转行1、背景描述2.方法描述2.1 方法12.2 方法22.3 方法32.4 方法43 思考与总结4 思维延伸4.1 例子14.2 例子2二、行转列1.准备数据2.行转列实...
    99+
    2024-04-02
  • Mysql行转列函数
    group_concat() 例: select oid from Test;  select group_concat(oid) from Test; 来源地址:https://blog.csd...
    99+
    2023-09-02
    mysql sql mybatis
  • MySQL行转列详情
    目录一、行转列SQL写法二、如果领导@你,让你在结果集中加上总数列呢?三、领导又双叒叕@你改需求四、结束语附录:创建表结构&测试数据SQL  MySQL行...
    99+
    2024-04-02
  • MySQL中列转行和行转列总结解决思路
    目录引言列转行行转列总结引言 在学习sql中遇到了列转行和行转列的题目,这里总结一下如何在对应的情景下解决不同的题目; 列转行 创建一个表stu_score_01: SET NAMES utf8mb4; SET FORE...
    99+
    2023-01-30
    MySQL列转行和行转列 MySQL列转行 MySQL行转列
  • mysql实现行转列的方法
    这篇文章主要介绍mysql实现行转列的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql实现行转列的方法:1、用cross join的方式实现,代码为【cross join...
    99+
    2024-04-02
  • mysql中的行列转换方法
    这篇文章主要介绍“mysql中的行列转换方法”,在日常操作中,相信很多人在mysql中的行列转换方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中的行列转换方法”...
    99+
    2024-04-02
  • SQL行转列与列转行的方法
    本文小编为大家详细介绍“SQL行转列与列转行的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL行转列与列转行的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数据集+---+----------+|i...
    99+
    2023-06-29
  • Pandas.DataFrame行和列如何转置
    本篇内容主要讲解“Pandas.DataFrame行和列如何转置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pandas.DataFrame行和列如何转置”吧!如果要交换(转置)pandas....
    99+
    2023-07-05
  • MySQL中列如何以逗号分隔转成多行
    目录mysql列以逗号分隔转成多行场景解决方案总结MySQL列以逗号分隔转成多行 业务场景: 在数据库中,有一张的一个字段存储方式是采用以逗号分隔存储多个值,现在需要将其进行拆分成多个独立的值,与另外一张字典表进行关联,...
    99+
    2023-02-07
    MySQL逗号分隔 MySQL逗号分隔多行 MySQL逗号
  • DB2行列转置的行转列是怎样的
    DB2行列转置的行转列是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。建表,并insert 2行数据CREATE TABLE Sales...
    99+
    2024-04-02
  • mysql行转列的方法有哪些
    在MySQL中,可以使用以下方法将行转列: 使用CASE语句:使用多个CASE语句将多行数据转换为单行。每个CASE语句对应一个列...
    99+
    2024-04-09
    mysql
  • MySQL行转列的方法是什么
    本篇内容介绍了“MySQL行转列的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们看一下咱们的测试表数据和预期查询的结果:...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作