Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >列转行-多列转多行(横表变竖表)

列转行-多列转多行(横表变竖表)

作者头像
数据仓库晨曦
发布于 2024-08-19 07:59:06
发布于 2024-08-19 07:59:06
24800
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

一、基础数据

有学生成绩表,包含学生id、语文、数学、英语三科成绩

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+--------+---------+---------+
| student_id  | yuwen  | shuxue  | yingyu  |
+-------------+--------+---------+---------+
| 001         | 89     | 95      | 77      |
| 002         | 92     | 83      | 97      |
| 003         | 81     | 94      | 88      |
+-------------+--------+---------+---------+

二、函数介绍

  • sum
  • case

三、多列转多行(横表变竖表)

原始数据为一张横表,分别有三列成绩列,想要转成竖表,需要转换成三列分别为 学生id、学科、成绩,转换完成之后学生id将不再是主键。

期望结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+--------+
| student_id  | subject  | score  |
+-------------+----------+--------+
| 001         | 语文       | 89     |
| 001         | 数学       | 95     |
| 001         | 英语       | 77     |
| 002         | 语文       | 92     |
| 002         | 数学       | 83     |
| 002         | 英语       | 97     |
| 003         | 语文       | 81     |
| 003         | 数学       | 94     |
| 003         | 英语       | 88     |
+-------------+----------+--------+

1.union all 完成数据

使用union all 对不同学科的数据进行组合,得到最终结果。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--语文成绩
select student_id,
       '语文' as subject,
       yuwen  as score
from t_student_score_02
union all
--数学成绩
select student_id,
       '数学' as subject,
       shuxue as score
from t_student_score_02
union all
--英语成绩
select student_id,
       '英语' as subject,
       yingyu as score
from t_student_score_02

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+--------+
| student_id  | subject  | score  |
+-------------+----------+--------+
| 001         | 语文       | 89     |
| 002         | 语文       | 92     |
| 003         | 语文       | 81     |
| 001         | 数学       | 95     |
| 002         | 数学       | 83     |
| 003         | 数学       | 94     |
| 001         | 英语       | 77     |
| 002         | 英语       | 97     |
| 003         | 英语       | 88     |
+-------------+----------+--------+

2.数据拼接后炸裂开

2.1拼接数据

使用concat对科目和科目对应的分数进行拼接,然后使用concat_ws把不同科目数据拼接到一起

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select student_id,
       concat_ws(',', concat('语文:', yuwen), concat('数学:', shuxue), concat('英语:', yingyu)) as sub_scores
from t_student_score_02

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+--------------------+
| student_id  |     sub_scores     |
+-------------+--------------------+
| 001         | 语文:89,数学:95,英语:77  |
| 002         | 语文:92,数学:83,英语:97  |
| 003         | 语文:81,数学:94,英语:88  |
+-------------+--------------------+
2.2 lateral view explode 将成绩列转行

使用lateral view explode 将成绩列转行,然后使用split将科目和分数分开。 执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select student_id,
       split(sub_score, ':')[0] as subject,
       split(sub_score, ':')[1] as score
from (select student_id,
             concat_ws(',', concat('语文:', yuwen), concat('数学:', shuxue), concat('英语:', yingyu)) as sub_scores
      from t_student_score_02)
         lateral view explode(split(sub_scores, ',')) t as sub_score

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+--------+
| student_id  | subject  | score  |
+-------------+----------+--------+
| 001         | 语文       | 89     |
| 001         | 数学       | 95     |
| 001         | 英语       | 77     |
| 002         | 语文       | 92     |
| 002         | 数学       | 83     |
| 002         | 英语       | 97     |
| 003         | 语文       | 81     |
| 003         | 数学       | 94     |
| 003         | 英语       | 88     |
+-------------+----------+--------+

四、数据准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--建表语句
CREATE TABLE IF NOT EXISTS t_student_score_02
(
    student_id string, -- 学生id
    yuwen      bigint,--语文成绩
    shuxue     bigint, --数学成绩
    yingyu     bigint  --英语成绩
)
    COMMENT '学生成绩表';
--数据插入语句
insert into t_student_score_02
select student_id,
       sum(case when subject = '语文' then score end) as yuwen,
       sum(case when subject = '数学' then score end) as shuxue,
       sum(case when subject = '英语' then score end) as yingyu
from t_student_score
group by student_id

本文同步在微信公众号”数据仓库技术“和个人博客”数据仓库技术“发表。原文:www.dwsql.com 同时有“数据仓库技术”社群以及有几十位小伙伴一起讨论数据仓库相关技术,欢迎你的加入,社群免费。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
行转列-多行转多列(竖表转横表)
原始数据中是一个竖表,每个学生的每个学科一行数据,对其转换成一张横表,即表中学生id为主键,包含语文、数学、英语三列,列值为对应学科分数。
数据仓库晨曦
2024/08/19
2310
行转列-多行转多列(竖表转横表)
行列转换-横表竖表互相转换
原始数据中是一个竖表,每个学生的每个学科一行数据,对其转换成一张横表,即表中学生id为主键,包含语文、数学、英语三列,列值为对应学科分数。
数据仓库晨曦
2024/09/12
1850
行列转换-横表竖表互相转换
【Apache Doris】行列转换 最佳实践指南
行列转换就是如下图所示两种展示形式的互相转换行转列我们来看一个简单的例子,我们要把下面第一个表格的数据转换成下边第二个表格的样式
一臻数据
2024/12/24
3040
【Apache Doris】行列转换 最佳实践指南
MySQL case when 用法
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END:枚举这个字段所有可能的值*
Java编程指南
2020/07/02
2.3K0
常见大数据面试SQL-有序行转列
有学生各学科分数表,记录了学生的各科分数,请按照学生粒度,生成两列数据分别为学科和分数,要求学科内的顺序与分数顺序一致。
数据仓库晨曦
2024/08/01
1140
常见大数据面试SQL-有序行转列
学习Java必刷编程练习题
现有一个Map集合,map中学号(String)为key,学生(Student)为value,分别使用keySet方式  和entrySet的方式 打印集合中每一个Student对象的name属性和age属性
陶然同学
2023/02/27
7760
SQL中进行转列的几种方式
在很多笔试的程序员中会有很多写SQL的情况,其中很多时候会考察行转列。那么这个时候如果能写出来几种行转列的SQL,会给面试官留下比较好的印象。
海仔
2019/08/06
2.9K0
SQL中进行转列的几种方式
Hive案例01-行列转换
其中字段意义: id(int) sid(int) subject(string) score(int) 分别代表: 本条记录的ID 学生ID 科目 成绩 需求: 求数学成绩比语文成绩好的学生的ID
CoderJed
2018/09/13
2.3K0
Hive案例01-行列转换
mysql行转列转换
sql 脚本 -- 创建表 学生表 CREATE TABLE `student` ( `stuid` VARCHAR(16) NOT NULL COMMENT '学号', `stunm` VARCHAR(20) NOT NULL COMMENT '学生姓名', PRIMARY KEY (`stuid`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB; -- 课程表 CREATE TABLE `courses` ( `cours
皇上得了花柳病
2020/05/04
2.1K0
mysql行转列简单例子_mysql行转列、列转行示例[通俗易懂]
最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。
全栈程序员站长
2022/07/01
5K0
mysql行转列简单例子_mysql行转列、列转行示例[通俗易懂]
【数据库】MySQL经典面试题(练习)
【数据库】MySQL经典面试题(练习) 一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条) 要求结果数据: 原始数据: CREATE TA
Java帮帮
2018/03/15
1.7K0
【数据库】MySQL经典面试题(练习)
PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定
SQL语句,简单的大家都会写,但如果是复杂的SQL语句,撰写起来很多程序员就不会了,甚至一些DBA也不会写,今天我们来模拟一些个别的例子来看看一些复杂的SQL语句怎么写。同时最后我们演示一下复杂的SQL 程序员和 DBA 在专项的思维模式不同导致的运行效率不同的案例。(想要看程序员和DBA的SQL撰写的比较直接到练习3)
AustinDatabases
2024/05/20
1210
PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定
建议收藏丨sql行转列的一千种写法!!
              那9个字,犹如一声惊雷,在这个热情的群里炸开了锅...
不吃西红柿
2022/07/29
1.4K0
建议收藏丨sql行转列的一千种写法!!
MySQL中concat()、concat_ws()、group_concat()函数
返回值: 结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
一觉睡到小时候
2022/11/16
4.4K0
sql语句练习题整理
3)李四语文成绩被登记错误,成绩实际为85分,更新到考试信息表中,SQL语句怎么编写?
全栈程序员站长
2022/07/25
2800
MySQL UPDATE 更新
昨天介绍了 MySQL 数据库 WHERE 子句的用法,今天来讲解下UPDATE 更新。
用户10358987
2024/04/23
4360
MySQL UPDATE 更新
数据库的存储过程_数据库的存储过程语句
  2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象。
全栈程序员站长
2022/09/21
4.2K0
数据库的存储过程_数据库的存储过程语句
Hive-SQL查询每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题:
数据仓库晨曦
2024/01/08
2510
Hive-SQL查询每年总成绩都有所提升的学生
MySQL存储过程_触发器_游标——Baidu Comate
红目香薰
2024/05/26
1210
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
有学生成绩表,包含学生姓名、学科、成绩三个字段,请用一条SQL查询出每个学科排名第三名的学生,他的学科成绩、总成绩、以及总排名。
数据仓库晨曦
2024/07/12
2470
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
相关推荐
行转列-多行转多列(竖表转横表)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验