【笔记】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://www.mzph.cn/news/53462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

以太坊硬分叉后的可重入漏洞攻击

以太坊硬分叉后的可重入漏洞攻击 以太坊君士坦丁堡升级将降低部分 SSTORE 指令的 gas 费用。然而,这次升级也有一个副作用,在 Solidity 语言编写的智能合约中调用 address.transfer()函数或 address.send()函数时存在可重入漏洞。在目前版本的以太坊网络…

RecyclerView面试问答

RecycleView 和 ListView对比: 使用方法上 ListView:继承重写 BaseAdapter,自定义 ViewHolder 与 converView优化。 RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 LayoutManager 来展示不同的布局样式 ViewHolder的编写规范化,ListVie…

基于蛾群算法优化的BP神经网络(预测应用) - 附代码

基于蛾群算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于蛾群算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.蛾群优化BP神经网络2.1 BP神经网络参数设置2.2 蛾群算法应用 4.测试结果:5.Matlab代码 摘要…

会声会影2023全新中文专业版下载安装教程

熟练使用会声会影视频编辑工具,对视频创作过程的帮助是极大的。大家可以放心大胆地去研究会声会影的视频编辑技巧,会声会影2023与以往版本会声会影版本最大的区别是:账户制管理。可以通过账户添加或移除设备,非常便捷。该软件一直…

量化QAT QLoRA GPTQ

模型量化的思路可以分为PTQ(Post-Training Quantization,训练后量化)和QAT(Quantization Aware Training,在量化过程中进行梯度反传更新权重,例如QLoRA),GPTQ是一种PTQ的思路。 QAT…

【安卓】自定义View实现画板涂鸦等功能

一、实现效果 二、代码 1、MainActivity.class package com.lsl.mydrawingboarddemo;import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;import android.os.Bundle; import android.os.Handler; import android.view.View; impo…

Langchain-React范式调用API —— 自定义工具

因为Langchain的代码也不是很复杂,因此 直接看代码会更好的学习。 一些说明,我已经放到了注释当中。 请各位看官享用。 代码样例 from langchain.agents import initialize_agent from langchain.llms import OpenAI from langchain.tools import Bas…

封装redis 分布式锁 RedisCallback

RedisCallback 是redis 一个回调接口,在 Redis 连接后执行单个命令,返回执行命令后的结果。 如果在使用 RedisCallback 时,需要自动获取 Redis 连接资源,使用完毕后并释放连接资源。 RedisTemplate 类提供了一个 execute 方法&am…

【C++进阶(一)】STL大法以及string的使用

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…

FastJson中JSON,JSONObject和JSONArray简单使用

JSON中提供了常用的对象和json数据间的转换方法。 JSONObject可以看作Map&#xff0c;使用key-value构建json对象。 JSONArray可以看作List&#xff0c;使用List可以简单构造json数组对象。1.pom.xml中引入依赖<dependency><groupId>com.alibaba.fastjson2</gro…

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术

远程调试环境

一、远程调试 1.安装vscode 2.打开vscode&#xff0c;下载插件Remote-SSH,用于远程连接 3.安装php debug 4.远程连接&#xff0c;连接到远端服务器 注&#xff1a;连接远程成功后&#xff0c;在远程依然要进行安装xdebug&#xff0c;刚才只是在vscode中进行的安装。 5.配置la…

R语言最简单的计算运行时间的方法

引言 要知道哪种编程的时间短&#xff0c;R语言中应该如何编码呢&#xff1f; 方法很简单&#xff0c;使用运行前Sys.time() 和运行后Sys.time()相减既可以得到运行时间。 代码如下 代码 #### 运行前时间timestart<-Sys.time()####程序运行 x <- rnorm(100000)y <…

UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用工具”->“用户默认设置”->“用户界面”->“操作记录”->“…

【机器学习】python基础实现线性回归

手写梯度下降的实现ykxb的线性回归 算法步骤&#xff1a; &#xff08;1&#xff09;构造数据&#xff0c;y3*x5; &#xff08;2&#xff09;随机初始化和&#xff0c;任意数值&#xff0c;例如9,10; &#xff08;3&#xff09;计算&#xff0c;,并计算 &#xff08;4&…

[ubuntu]linux服务器每次重启anaconda环境变量失效

云服务器每次重启后conda不能用了&#xff0c;应该是系统自动把设置环境变量清除了。如果想继续使用&#xff0c;则可以运行一下 minconda3激活方法&#xff1a; source ~/miniconda3/bin/activate anaconda3激活方法&#xff1a; source ~/anaconda3/bin/activate 你也修改b…

034 - year 年份类型

该YEAR类型是1字节类型&#xff0c;用于表示年份值。可以将其声明为 YEAR具有4个字符的隐式显示宽度&#xff0c;或等效于YEAR(4)显式显示宽度。 注意&#xff1a; 从MySQL 8.0.19开始&#xff0c;不建议YEAR(4) 使用具有显式显示宽度的数据类型&#xff0c;并且您应该期望在…

CCD 图形传感器

概述 CCD&#xff08;Charge Coupled Device&#xff09;是一种半导体器件&#xff0c;能够把光学影像转化为电信号。它是一种广泛使用的图像传感器&#xff0c;特别是在数码相机和摄像机中。 CCD图像传感器由许多排列成矩阵的微小像素组成&#xff0c;每个像素能够将光子转变…

只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析

青岛理工大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 青岛理工…

Vue2向Vue3过度核心技术指令补充

目录 1 指令修饰符1.1 什么是指令修饰符&#xff1f;1.2 按键修饰符1.3 v-model修饰符1.4 事件修饰符 2 v-bind对样式控制的增强-操作class2.1 语法&#xff1a;2.2 对象语法2.3 数组语法2.4 代码练习 3 京东秒杀-tab栏切换导航高亮3.1 需求&#xff1a;3.2 准备代码:3.3 思路&…