iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql学习——行与列的多种转换
  • 794
分享到

Mysql学习——行与列的多种转换

sql数据库 2023-09-01 07:09:55 794人浏览 薄情痞子
摘要

目录 一、行转列 二、列转行 三、多列转一行 四、一行转多列 五、行转列的其案例 首先准备一张表 CREATE TABLE CJ( Name varchar(32), Subject varchar(

目录

一、行转列

二、列转行

三、多列转一行

四、一行转多列

五、行转列的其案例


首先准备一张表

CREATE TABLE CJ(    Name    varchar(32),    Subject varchar(32),    Result  int(10));# 插入数据insert into cjvalues ('张三', '语文', 80),       ('张三', '数学', 90),       ('张三', '物理', 85),       ('李四', '语文', 85),       ('李四', '数学', 92),       ('李四', '物理', 82);

一、行转列

第一步,先将科目分类好:

SELECT Name,       CASE WHEN Subject='语文' THEN Result ELSE 0 END AS 语文,       CASE WHEN Subject='数学' THEN Result ELSE 0 END AS 数学,       CASE WHEN Subject='数学' THEN Result ELSE 0 END AS 物理FROM cj;

第二步:将上面的结果看做一张表,从表中找出每一个新字段的最大值,对Name进行分组

SELECT T.Name,       MAX(T.语文) 语文,       MAX(T.数学) 数学,       MAX(T.物理) 物理FROM (SELECT Name,       CASE WHEN Subject='语文' THEN Result ELSE 0 END AS 语文,       CASE WHEN Subject='数学' THEN Result ELSE 0 END AS 数学,       CASE WHEN Subject='数学' THEN Result ELSE 0 END AS 物理FROM cj) TGROUP BY T.Name;

案例二:查询用户安装APP的情况

create table app(    id  int,    app varchar(32));insert into app(id, app)VALUES (1, '微信'),       (2, '快手'),       (3, 'QQ'),       (4, '抖音'),       (5, '美团'),       (6, '饿了么'),       (7, '支付宝'),       (8, '拼多多'),       (9, '高德地图');CREATE TABLE app_install(    uid int,    app varchar(32));insert into app_install(uid, app)VALUES (1, '微信'),       (1, '美团'),       (2, '支付宝'),       (2, '高德地图'),       (3, '拼多多');select uid,       case when app = '微信' then 1 else 0 end as 'wx',       case when app = '快手' then 1 else 0 end as 'ks',       case when app = 'QQ' then 1 else 0 end as 'qq',       case when app = '抖音' then 1 else 0 end as 'dy',       case when app = '美团' then 1 else 0 end as 'mt',       case when app = '饿了么' then 1 else 0 end as 'elm',       case when app = '支付宝' then 1 else 0 end as 'zfb',       case when app = '拼多多' then 1 else 0 end as 'pdd',       case when app = '高德地图' then 1 else 0 end as 'gd'from app_install;select t.uid,       case when max(t.wx) then '已安装' else '未安装' end as 'wx',       case when max(t.ks) then '已安装' else '未安装' end as 'ks',       case when max(t.qq) then '已安装' else '未安装' end as 'qq',       case when max(t.dy) then '已安装' else '未安装' end as 'dy',       case when max(t.mt) then '已安装' else '未安装' end as 'mt',       case when max(t.elm) then '已安装' else '未安装' end as 'eml',       case when max(t.zfb) then '已安装' else '未安装' end as 'zfb',       case when max(t.pdd) then '已安装' else '未安装' end as 'pdd',       case when max(t.gd) then '已安装' else '未安装' end as 'gd'from  (select uid,       case when app = '微信' then 1 else 0 end as 'wx',       case when app = '快手' then 1 else 0 end as 'ks',       case when app = 'QQ' then 1 else 0 end as 'qq',       case when app = '抖音' then 1 else 0 end as 'dy',       case when app = '美团' then 1 else 0 end as 'mt',       case when app = '饿了么' then 1 else 0 end as 'elm',       case when app = '支付宝' then 1 else 0 end as 'zfb',       case when app = '拼多多' then 1 else 0 end as 'pdd',       case when app = '高德地图' then 1 else 0 end as 'gd'from app_install) tgroup by t.uid;

连表比子查询要好  

二、列转行

建表

CREATE TABLE CJ2(    Name varchar(32),    `语文` int(10),    `数学` int(10),    `物理` int(10));# 插入数据insert into cj2 values ('张三',80,90,90),('李四',85,92,92);

原表:

SELECT Name,'语文' cource,语文 resultFROM cj2uNIOn allSELECT Name,'数学' cource,数学 resultFROM cj2union allSELECT Name,'物理' cource,物理 resultFROM cj2;# 查询后按照结果排序SELECT *FROM (SELECT Name,'语文' cource,语文 resultFROM cj2union allSELECT Name,'数学' cource,数学 resultFROM cj2union allSELECT Name,'物理' cource,物理 resultFROM cj2) TORDER BY T.Name;

三、多列转一行

将科目与分数排在一列

SELECT Name,GROUP_CONCAT(Subject,':',Result) 成绩FROM cjgroup by Name;

 

四、一行转多列

将上表还原

# 建表CREATE TABLE CJ3(    Name varchar(32),    `成绩` varchar(50));# 插入数据insert into cj3values ('张三', '语文:80,数学:90,物理:85'),       ('李四', '语文:85,数学:92,物理:82');

SELECT Name,       CASE           WHEN LOCATE('语文', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '语文:', -1), ',', 1)           else 0 end as 语文,       CASE           WHEN LOCATE('数学', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '数学:', -1), ',', 1)           else 0 end as 数学,       CASE           WHEN LOCATE('物理', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '物理:', -1), ',', 1)           else 0 end as 物理from cj3;

SELECT T1.Name, '语文' Cource, T1.语文 resultFROM (SELECT Name,             CASE                 WHEN LOCATE('语文', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '语文:', -1), ',', 1)                 else 0 end as 语文      from cj3) T1union allSELECT T2.Name, '数学' Cource, T2.数学 resultFROM (SELECT Name,             CASE                 WHEN LOCATE('数学', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '数学:', -1), ',', 1)                 else 0 end as 数学      from cj3) T2union allSELECT T3.Name, '物理' Cource, T3.物理 resultFROM (SELECT Name,             CASE                 WHEN LOCATE('物理', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '物理:', -1), ',', 1)                 else 0 end as 物理      from cj3) T3;

SELECT *FROM (SELECT T1.Name, '语文' Cource, T1.语文 resultFROM (SELECT Name,             CASE                 WHEN LOCATE('语文', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '语文:', -1), ',', 1)                 else 0 end as 语文      from cj3) T1union allSELECT T2.Name, '数学' Cource, T2.数学 resultFROM (SELECT Name,             CASE                 WHEN LOCATE('数学', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '数学:', -1), ',', 1)                 else 0 end as 数学      from cj3) T2union allSELECT T3.Name, '物理' Cource, T3.物理 resultFROM (SELECT Name,             CASE                 WHEN LOCATE('物理', 成绩) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成绩, '物理:', -1), ',', 1)                 else 0 end as 物理      from cj3) T3) TORDER BY T.Name;

五、行转列的其他案例

准备一张result表

行转列

# 查询1000号学生四门科目的成绩select StudentNo,       case when SubjectNo = 1 then StudentResult else 0 end as 高等数学1,       case when SubjectNo = 2 then StudentResult else 0 end as 高等数学2,       case when SubjectNo = 3 then StudentResult else 0 end as java编程,       case when SubjectNo = 4 then StudentResult else 0 end as hadoop理论from resultwhere StudentNo = 1000;

# 简化select StudentNo, MAX(高等数学1) math1, MAX(高等数学2) math2, MAX(java编程) java, MAX(hadoop理论) hadoopfrom (select StudentNo,             case when SubjectNo = 1 then StudentResult else 0 end as 高等数学1,             case when SubjectNo = 2 then StudentResult else 0 end as 高等数学2,             case when SubjectNo = 3 then StudentResult else 0 end as java编程,             case when SubjectNo = 4 then StudentResult else 0 end as hadoop理论      from result      where StudentNo = 1000) T;

来源地址:https://blog.csdn.net/Helen_1997_1997/article/details/128282029

您可能感兴趣的文档:

--结束END--

本文标题: Mysql学习——行与列的多种转换

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

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

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

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

下载Word文档
猜你喜欢
  • Mysql学习——行与列的多种转换
    目录 一、行转列 二、列转行 三、多列转一行 四、一行转多列 五、行转列的其案例 首先准备一张表 CREATE TABLE CJ( Name varchar(32), Subject varchar(...
    99+
    2023-09-01
    sql 数据库
  • 学习mysql 如何行转列与列传行
    目录一、行转列—case+groupby二、列转行——union一、行转列— case+group by mysql>...
    99+
    2024-04-02
  • mysql中的行列转换方法
    这篇文章主要介绍“mysql中的行列转换方法”,在日常操作中,相信很多人在mysql中的行列转换方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中的行列转换方法”...
    99+
    2024-04-02
  • python如何实现Excel多行多列的转换
    今天小编给大家分享一下python如何实现Excel多行多列的转换的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、使用需求...
    99+
    2023-07-05
  • python实现Excel多行多列的转换的示例
    目录前言一、使用需求二、使用步骤总结前言 使用pandas对Excel的多行和多列进行转换 提示:以下是本篇文章正文内容,下面案例可供参考 一、使用需求 将上表中的多行多列数据转换...
    99+
    2023-03-13
    python Excel行列转换 python 行列转换
  • SQL行转列与列转行的方法
    本文小编为大家详细介绍“SQL行转列与列转行的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL行转列与列转行的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数据集+---+----------+|i...
    99+
    2023-06-29
  • 《Flink学习笔记》——第九章 多流转换
    无论是基本的简单转换和聚合,还是基于窗口的计算,我们都是针对一条流上的数据进行处理的。而在实际应用中,可能需要将不同来源的数据连接合并在一起处理,也有可能需要将一条流拆分开,所以经常会有对多条流进行处理的场景 简单划分(两大类): 分...
    99+
    2023-08-30
    flink 学习 笔记
  • MySQL 中行列转换的SQL技巧有哪些
    这篇文章给大家分享的是有关MySQL 中行列转换的SQL技巧有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。行列转换常见场景 由于很多业务表因为历史原因或者性能原因,都使用...
    99+
    2024-04-02
  • SQLServer使用PIVOT与unPIVOT实现行列转换
    一、sql行转列:PIVOT 1、基本语法: create table #table1 ( id int ,code varchar(10) , name v...
    99+
    2024-04-02
  • MySQL - 各种超时时间 - 学习与探究
    应用场景 主要用于学习与探究MySQL各种超时时间,应用在合适的场景下. 学习/操作 1.文档阅读 https://wen.geekr.dev/ chatgpt & 官方文档 & 其他资料...
    99+
    2023-09-12
    mysql 超时 会话级变量 全局变量
  • SQL四种方法实现行列转换超详细
    前言 大家好,我是楚生辉,在未来的日子里我们一起来学习大数据SQL相关的技术,一起努力奋斗,遇见更好的自己! 本文详细的介绍了多个方法实现列转行,行转列,并提供了案例的材料,有需要的小伙伴可以自行获取与学习~ 数据准备 CREAT...
    99+
    2023-08-18
    sql 数据库 mysql
  • 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
  • sql多表行转列和级联行转列的方法
    本篇内容主要讲解“sql多表行转列和级联行转列的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sql多表行转列和级联行转列的方法”吧!现有两表A,B A表存...
    99+
    2024-04-02
  • mysql中怎么实现行列转换操作
    这篇文章将为大家详细讲解有关mysql中怎么实现行列转换操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。create table tx(id int pr...
    99+
    2024-04-02
  • 【SQL应知应会】行列转换(二)• MySQL版
    欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 行列转换 • Mys...
    99+
    2023-08-25
    mysql adb 数据库 大数据 oracle 数据分析
  • 【MySQL系列】表约束的学习
    「前言」文章内容大致是MySQL的表的约束。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表的约束1.1 空属性1.2 默认值(default)1.3 列描述(comme...
    99+
    2023-08-16
    mysql 学习 adb
  • 【MySQL系列】MySQL内置函数的学习
    「前言」文章内容大致是对MySQL内置函数的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL的日期函数二、MySQL的字符串函数三、MySQL的数学函数四、 其它函数...
    99+
    2023-08-28
    mysql 学习 android
  • 通用的行列转换的方法
    在工作中经常需要用到行列转换进行聚合统计之类的事儿,现在就说一个最简单最通用的方法, 适应sum()/max()/min()等函数结合decode来实现行列转换, 拿oracle中典型的scott.emp表...
    99+
    2024-04-02
  • 怎样进行MySQL的学习
    怎样进行MySQL的学习,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MyISAM和InnoDB对比MyISAMInnoDB主外键不支持支持事务不支持支持行表锁表锁,操作时即使...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作