【笔记】MySQL行转列函数

GROUP_CONCAT()函数

创建表person_info,并插入数据


CREATE TABLE `person_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`family` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;INSERT INTO niffler.person_info (name, family) VALUES('张三', '张三爸');
INSERT INTO niffler.person_info (name, family) VALUES('张三', '张三妈');
INSERT INTO niffler.person_info (name, family) VALUES('李四', '李四爸');
INSERT INTO niffler.person_info (name, family) VALUES('李四', '李四妈');
INSERT INTO niffler.person_info (name, family) VALUES('李四', '李四大哥');
INSERT INTO niffler.person_info (name, family) VALUES('王二', '王二爷爷');
INSERT INTO niffler.person_info (name, family) VALUES('王二', '王二姐姐');
idnamefamily
1张三张三爸
2张三张三妈
3李四李四爸
4李四李四妈
5李四李四大哥
6王二王二爷爷
7王二王二姐姐

语法:

GROUP_CONCAT([DISTINCT] expr [,expr ...][ORDER BY {unsigned_integer | col_name | expr}[ASC | DESC] [,col_name ...]][SEPARATOR str_val])

示例:

SELECT name, GROUP_CONCAT(family SEPARATOR '&') AS familys FROM person_info GROUP BY name;

结果:

在这里插入图片描述
可以看看我上篇写的关于GROUP_CONCAT()的文章【笔记】MySQL数据库GROUP_CONCAT() 函数输出结果的长度限制

CASE函数

MySQL中的CASE表达式不是行转列函数。它是一种条件表达式,用于根据条件对数据进行选择、计算和转换。

然而,你可以使用CASE表达式来实现行转列的效果。通过在CASE表达式中定义不同的条件和相应的结果,你可以将行的数据按照不同的条件拆分到不同的列中。

创建表person_grade,并插入数据

CREATE TABLE `person_grade` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`subject` varchar(100) DEFAULT NULL,`mark` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;INSERT INTO niffler.person_grade (name, subject, mark) VALUES('张三', '数学', 66);
INSERT INTO niffler.person_grade (name, subject, mark) VALUES('张三', '语文', 99);
INSERT INTO niffler.person_grade (name, subject, mark) VALUES('李四', '数学', 77);
INSERT INTO niffler.person_grade (name, subject, mark) VALUES('李四', '政治', 80);
idnamesubjectmark
1张三数学66
2张三语文99
3李四数学77
4李四政治80

以subject列为表头,展示每个人的成绩

select name , (case subject when '数学' then mark end) as '数学' ,(case subject when '语文' then mark end) as '语文' ,(case subject when '政治' then mark end) as '政治' 
from person_grade;

结果

在这里插入图片描述
确实是按照subject列作为表头展示了成绩,但是每条成绩都占用一行,那么如何把同一个人的成绩都在一行展示呢?

select name , MAX(case subject when '数学' then mark end) as '数学' ,MAX(case subject when '语文' then mark end) as '语文' ,MAX(case subject when '政治' then mark end) as '政治' 
from person_grade
group by name ;

结果

在这里插入图片描述

上面的脚本,把MAX函数换成SUM函数,效果一样;除了CASE函数,也可使用IF函数实现行转列的效果。

GROUP_CONCAT()和CASE()结合实现动态行转列

通过CASE()函数的例子可以看到,表头行字段数学语文政治都是我们提前已经知晓并且手动指定的,那么如果我们事先不知道有哪些表头字段,怎么办呢?

可以通过下面的脚本实现:

SET @sql = NULL;
SELECTGROUP_CONCAT(DISTINCTCONCAT('max(case when subject = ''',subject,''' then mark end) ',subject)) INTO @sql
FROMMeeting;
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting GROUP BY Meeting_id');PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;# 定义预处理语句
# PREPARE stmt_name FROM preparable_stmt;
# 执行预处理语句
# EXECUTE stmt_name [USING @var_name [, @var_name] ...];
# 删除(释放)定义
# {DEALLOCATE | DROP} PREPARE stmt_name;

先来看看这句的执行的效果:

SELECTGROUP_CONCAT(DISTINCTCONCAT('max(case when subject = ''',subject,''' then mark end) as ',subject)) 
FROMMeeting;

执行结果:

max(case when subject = '政治' then mark end) as 政治,max(case when subject = '数学' then mark end) as 数学,max(case when subject = '语文' then mark end) as 语文

是不是已经看出来了,就是为了动态得到行,不是由我们手动指定的,而是通过脚本自动生成、拼接而来。

然后把拼接后的结果 INTO @sql

再通过

SET @sql = CONCAT('SELECT name, ', @sql, ' FROM person_grade GROUP BY name');

拼成完整的SQL

SELECT name,max(case when subject = '政治' then mark end) as 政治,max(case when subject = '数学' then mark end) as 数学,max(case when subject = '语文' then mark end) as 语文
FROM person_grade 
GROUP BY name

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1549914.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城环境搭建二:开发环境统一

开发环境配置统一 Maven配置 查看maven信息 修改配置文件&#xff1a;apache-maven-3.3.9\conf\settings.xml# 配置阿里云镜像 <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name&…

htc hd2连上wifi却显示无法连接服务器,HTC HD2线刷官方ROM疑难问题解答

HTC HD2线刷官方ROM更新实用程序 (RUU)需要注意哪些问题呢&#xff1f;安致小编在这里为大家整理这篇 《HTC HD2线刷官方ROM疑难问题解答》&#xff0c;希望对大家线刷官方RUU有所帮助。 开始准备: 运行 ROM 更新实用程序 (RUU) 前&#xff0c;请确认下列事项&#xff1a; 1.An…

提取官方原生(RUU/.exe)ROM刷机文件

官方ROM提取刷机文件结构主要为&#xff1a; android-info.txt&#xff0c;boot.img&#xff0c;hboot_*.nb0&#xff0c;radio.img&#xff0c;rcdata.img&#xff0c;recovery.img&#xff0c;splash1.nb0&#xff0c;system.img&#xff0c;userdata.img 官方(.exe)ROM提取过…

HTC One V卡刷RUU准备工作 图文教程详解

为什么80%的码农都做不了架构师&#xff1f;>>> HTC One V卡刷RUU准备工作 图文教程详解 相对于线刷&#xff0c;HTC One V卡刷RUU更为方便快捷&#xff0c;不会和普通RUU那样这么容易出错&#xff0c;不必害怕刷机中发生断电等意外事故&#xff0c;也可以重启或者…

Elasticsearch-8.x.x安装启动后测试报错[WARN ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [DESKTOP-0QU7RUU]

浏览器输入 IP:端口号后报错。&#xff08;*默认端口号9200&#xff0c;自定义端口号在elasticsearch.yml文件里http.port: 自定义端口&#xff09; [WARN ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [DESKTOP-0QU7RUU] received plaintext http traffic on an https c…

HTC ONE X刷ruu的详细刷机教程

一&#xff1a;准备工作&#xff1a; 1&#xff1a;手机必须能用usb数据线电脑&#xff0c;因为是线刷&#xff0c;所以必须要有数据线 2&#xff1a;检查一下电脑&#xff0c;确保电脑上已经安装htc one m7的usb驱动了 2&#xff1a;下载ruu刷机包&#xff0c;下载适合一款…

测试基础|一文了解,这5种不同类别的软件测试工具都有啥用

介绍&#xff1a;对于任何希望确保其数字产品的质量和性能的企业来说&#xff0c;软件测试工具都是宝贵的资产。从桌面应用程序到Web平台&#xff0c;软件测试工具提供了一整套功能&#xff0c;可帮助开发人员在潜在问题成为代价高昂的问题之前识别并解决它们。彻底的测试变得至…

【机器人学】3-RUU-delta并联机器人正运动学、逆运动学和微分运动学

文章目录 串联和并联机器人对比delta机器人逆运动学正运动学微分运动学工作空间 串联和并联机器人对比 串联机器人和并联机器人各有优缺点。 串联机器人 优点 工作空间大&#xff1b;可实现的姿态多&#xff1b; 缺点 能量效率低&#xff0c;加速性差&#xff1b;末端负载小…

htc e9刷android6,HTC E9+刷机教程_HTC ONE E9+刷zip格式的ruu包的方法

说了有关HTC ONE E9的官方ruu包了&#xff0c;说的是卡刷形式了&#xff0c;那就是来说说咱们的这个卡刷形式的rom包怎么刷入手机吧&#xff0c;这个也不复杂&#xff0c;也不需要借助于第三方的刷机软件就可以操作了&#xff0c;是利用手机自带的升级系统来进行升级的&#xf…

htc x920e刷android7.0,HTC X920E (Butterfly) 刷回官方RUU固件教程

其实htc手机的线刷刷机是最容易的了&#xff0c;因为htc的官方包就是exe格式的&#xff0c;直接可以下载下来运行刷入就可以了&#xff0c;下面来说说HTC X920E/Droid DNA/Butterfly的具体的刷ruu的教程吧&#xff0c;这个教程也可以用来救砖用&#xff0c;如果你的手机刷机失败…

htc d826 android 6,HTC 826官方ruu固件rom包_HTC Desire 826刷机包和升级包

今天看到论坛里已经有机友分享过HTC Desire 826的固件包了,也就是大家常说ruu包,现在咱们的这个手机多数是通过ruu包来进行升级的,没有什么太复杂的,今天在这里先分享的卡刷格式的ruu包,因为线刷的ruu包还没出来,等以后出来了再给大家分享出来,在这里会一块儿更新的,不…

htc+one+m7+linux驱动,HTC One M7线刷官方ruu包的教程

上次给大家说过了卡刷的教程了&#xff0c;可是很多人怕刷机失败&#xff0c;这种情况下就只能刷回官方的ruu包了&#xff0c;下面就来说说HTC One/M7/801e怎么来刷回官方的的ruu固件包&#xff0c;由于多数的官方ruu包都是exe格式的&#xff0c;都是用数据线连接电脑&#xff…

激动呀,htc desire s g12 4.0 RUU包htc 官方下载地址已放出,有图为证

不多说了直接上地址 http://dl4.htc.com/RomCode/Source_and_Binaries/RUU_SAGA_ICS_35_S_HTC_EU_14.01.401.2_20.76.30.0835_3831.19.00.110_275068.zip 大小: 17.7 KB 查看图片附件

htc one m7 linux驱动,HTC One M7官方RUU固件包(可救砖)

在网上找了找关于HTC One M7 (801e)的官方ruu固件包还不多,找了一些,不过有些不能下载,在这里整理了几款可以下载的官方ruu包,这些包都是官方原版的,都是支持线刷的,大家可以下载下来备用了,也可以用来救砖用的。 注意:htc手机的官方RUU固件系统包分为两种格式的,一种…

持续集成与持续交付:现代软件测试的变革之路

引言 在数字化时代&#xff0c;软件开发的速度和复杂性都在不断增加。为了满足市场的需求&#xff0c;企业需要更快、更高效地交付高质量的软件产品。在这样的背景下&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;成为了软件开发和测试的核心实践。 软件开发的…

知识蒸馏Demo,非常详细,适合入门

文章来自&#xff1a;Ai浩的“知识蒸馏实战&#xff1a;使用CoatNet蒸馏ResNet”&#xff0c;文章地址为&#xff1a;知识蒸馏实战&#xff1a;使用CoatNet蒸馏ResNet_知识蒸馏实例_AI浩的博客-CSDN博客 感谢作者&#xff01;&#xff01;&#xff01; 摘要 知识蒸馏&#xf…

STM32独立看门狗

参考正点原子视频 看门狗 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#xff0c;由单片机控制的系统无法继续工作&#xff0c;会造…

Verilog | 看门狗

一、 看门狗简介 看门狗&#xff1a;也称看门狗定时器&#xff0c;是常见于系统的一种外设&#xff1b;看门狗似乎就是一条看门的狗&#xff0c;如果系统一切正常则看门狗不叫&#xff0c;如果程序不正常&#xff0c;则看门狗则会将程序咬死&#xff08;即程序强制复位&#x…

软件看门狗实现

一文看懂看门狗&#xff08;附STM和英飞凌芯片应用&#xff09; 文章目录 一文看懂看门狗&#xff08;附STM和英飞凌芯片应用&#xff09;(一)看门狗概述(二)硬件看门狗(三)软件看门狗 (一)看门狗概述 看门狗定时器&#xff08;WDT&#xff0c;Watch Dog Timer&#xff09;是单…

为HttpClient开启HTTP/2

正文 .Net Core在调用其他服务时&#xff0c;调用通常使用HttpClient&#xff0c;而HttpClient默认使用HTTP/1.1 。 配置 HttpClient 以使用 HTTP/2 h2 连接 自 .NET Core 3.0 发布以来&#xff0c; .NET 开发人员可以使用 HttpClient 启用 HTTP/2 。 设置 HTTP/2 的方法 De…