【笔记】MySQL行转列函数

news2024/12/24 9:08:53

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;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when subject = ''',
      subject,
      ''' then mark end) ',
      subject
    )
  ) INTO @sql
FROM
  Meeting;
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;

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

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when subject = ''',
      subject,
      ''' then mark end) as ',
      subject
    )
  ) 
FROM
  Meeting;

执行结果:

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.coloradmin.cn/o/916856.html

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

相关文章

使用opencv-python在图片上显示中文

测试图像如下: 核心代码如下: import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFontdef cv2ImgAddText(img, text, left, top, textColor(0, 255, 0), textSize20):if (isinstance(img, np.ndarray)): #判断是否OpenCV图片类型…

如何获取微软商店应用的appx程序包,并实现离线安装

我们以“NVIDIA Control Panel”为例 (1)先在网页版Microsoft应用商店(https://www.microsoft.com/zh-cn/store/apps/?rtc1)这里找到NVIDIA Control Panel,将网页链接地址复制下; (2)到 https://store.r…

恒运资本:沪指震荡跌0.55%坚守3100点,券商等板块走低,数据要素概念再活跃

23日早盘,两市股指低开低走,沪指盘中再次失守3100点,深成指、创业板指跌幅均超1%;北向资金连续流出态势,半日净卖出超70亿元。 截至午间收盘,沪指跌0.55%报3103.1点,深成指跌1.08%,创…

解决 go mod tidy 加载模块超时

如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息: go envgo env -w GOPROXYhttps://goproxy.cn

fdm-cli,一个致力于管理项目初始化模板的工具脚手架

希望各位可以了解fdm-cli,并在合适的时候尝试使用一下。 阅读本文你将获得 一个(好用的)项目模板初始化工具这个(好用的)工具的使用方法给作者点一个 star 的机会 一、不愿再复制粘贴 小N每次在写项目的时候&#x…

第三届“赣政杯”总决赛 | 赛宁筑牢党政机关安全屏障

为提高江西省党政机关网络安全意识,普及网络安全知识,提升网络安全防护能力,筑牢网络安全屏障,由江西省委网信办、江西省发展改革委主办,江西省大数据中心、国家计算机网络与信息安全管理中心江西分中心承办&#xff0…

Java“牵手”虾皮商品列表数据,关键词搜索虾皮(Shopee)商品数据接口,虾皮API申请指南

虾皮(SHOPEE)商城是一个网上批发购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取虾皮商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问虾皮商城的网页来获取商品详情…

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

程序员35岁的破局之道

微信公众号访问地址:程序员35岁的破局之道 近期热推文章: 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、基于Redis的Geo实现附近商铺搜索(含源码) 4、基…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part II

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法 Part II 如何下载和安装openCV和Cmake可以看这篇文章。 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022openCV4.8.0) Part I_松下J27的博客-CSDN博客 下面我…

网络安全(黑客)入门

想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全…

1782. 统计点对的数目

给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数…

【SpringCloudAlibaba】Nacos服务注册和配置中心配合nginx负载

文章目录 概述注册中心POMYML启动类 CAP配置中心POMYML启动类ConfigClientControllerNacos中的匹配规则三种方案加载配置示例 集群部署概述部署模式修改derby为mysql配置cluster.conf编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口Nginx的配置&#xff…

以软件定义存储实现存力与算力的协同,应对 AI 时代数据挑战

本文根据 XSKY 星辰天合高级副总裁张旭明在“算力与前沿技术创新发展论坛”上的演讲内容整理,略有删节。 算力与前沿技术创新发展论坛以“算力创新跃迁 赋能数字经济”为主题,8 月 17 日在汕头召开,该论坛由工业和信息化部、广东省人民政府主…

养号自动化,指纹浏览器和RPA机器人解除烦恼

在这个充满科技魔力的时代,社交媒体已经成为人们生活的一部分,而Facebook更是我们分享欢乐、联络亲友的重要平台。然而,随之而来的是一个棘手的问题:如何保持账号的活跃度,而又不被沉重的养号工作压垮?别担…

Linux centos7 统计文本文件中所有单词

统计文本文件中高频词是常见操作(参考文章:Linux centos7 高频词统计)。而查找并统计文本文件中共有多少单词(独立字符串,包括中文或数字串)也是一项很好地实践项目。 本文主要应用命令替换、循环结构、so…

POSTGRESQL 如何用系统函数来诊断权限问题

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

H36M VS 3DPW datasets

1采集设备方面 H36M使用了高精度的多视角摄像机动态捕捉系统获得了非常准确和连贯的3D关节坐标标注。 3DPW使用了单目摄像机与IMU的复合传感系统进行采集,存在一定程度的标注噪声。 2场景环境方面 H36M主要针对室内定向动作,背景单一简洁。 3DPW重点是室外复杂环境中人的自…

第九章,社区侧栏

9.1添加实战课程 <template><div v-if="slides.length" class="carousel slide" @mouseover="stop" @mouseout="play"><div class="carousel-inner"><transitionenter-active-class="animated…

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

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