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

2024-09-06 13:52

本文主要是介绍列转行-多列转多行(横表变竖表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基础数据

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

+-------------+--------+---------+---------+
| student_id  | yuwen  | shuxue  | yingyu  |
+-------------+--------+---------+---------+
| 001         | 89     | 95      | 77      |
| 002         | 92     | 83      | 97      |
| 003         | 81     | 94      | 88      |
+-------------+--------+---------+---------+

二、函数介绍

  • sum
  • case

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

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

期望结果

+-------------+----------+--------+
| 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

--语文成绩
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

执行结果

+-------------+----------+--------+
| 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

select student_id,concat_ws(',', concat('语文:', yuwen), concat('数学:', shuxue), concat('英语:', yingyu)) as sub_scores
from t_student_score_02

执行结果

+-------------+--------------------+
| 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

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_scoresfrom t_student_score_02)lateral view explode(split(sub_scores, ',')) t as sub_score

执行结果

+-------------+----------+--------+
| student_id  | subject  | score  |
+-------------+----------+--------+
| 001         | 语文       | 89     |
| 001         | 数学       | 95     |
| 001         | 英语       | 77     |
| 002         | 语文       | 92     |
| 002         | 数学       | 83     |
| 002         | 英语       | 97     |
| 003         | 语文       | 81     |
| 003         | 数学       | 94     |
| 003         | 英语       | 88     |
+-------------+----------+--------+

四、数据准备

--建表语句
CREATE TABLE IF NOT EXISTS t_student_score_02
(student_id string, -- 学生idyuwen      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

相关推荐

  1. 行转列-collect_list,collect_set进行简单行转列
  2. 行转列-使用transform进行有序行转列
  3. 行转列-使用transform进行有序行转列-多列一一对应
  4. 行转列-多行转多列(竖表转横表)
  5. 列转行-多列转多行(横表变竖表)
  6. 列转行-lateral view explode列转行
  7. 列转行-explode_outer和lateral view outer
  8. 列转行-posexplode多列对应转行
  9. 列转行-lateral view outer posexplode及posexplode_outer多列对应转行

这篇关于列转行-多列转多行(横表变竖表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142192

相关文章

零经验想跳槽转行网络安全,需要准备什么?(详细版)

给大家的福利 🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 最近在后台收到了部分私信,大部分都是关于网络安全转行的问题,其中,目前咨询最多的是:觉得现在的工作没有发展空间,替代性强,工资低,想跳槽转行网络安全。其中,大家主要关心的是:没有经验怎么学习?需要准备什么?发展前景好吗?能拿到高薪吗? 等等这类的话题。 在这里我将问题总结划为了三个: 网

TC开发中写多行属性char**处理方法

//申请一个动态的数组 char ** indeta_s = (char**)MEM_alloc( sizeof(char*)vec_indeta.size()+1); for(int k=0;k<vec_indeta.size();k++){ printf(“indeta添加到数组\n”); //给数组对象分配一个动态的字符串长度 indeta_s[k]=(char)MEM_alloc( siz

多行命令提示符中的命令合成一行

C:\Windows\System32\cmd & cd C:\Siemens\Teamcenter12\tc_menu & C:\Siemens\Teamcenter12\tc_menu\tcdb_config1.bat & C:\Users\Administrator\Desktop\ITK\TEST1\x64\Debug\TEST1.exe 用&分割 C:\Windows\System3

PuTTY客户端下Linux单条命令分多行书写遇到的坑

众所周知, 编写Linux shell脚本时, 如果单条命令过长, 可在脚本中使用反斜杠 \ 来进行换行书写, 这样虽然命令占了多行, 但仍旧是一条命令, 方便阅读. 举例说明, 以下是一条创建一个redis应用的docker容器的命令: docker run -p 6379:6379 \--privileged=true --name redis \-v /home/docker/red

jquery 插件实现多行文本框[textarea]自动高度

<div class="form-group"><label class="col-sm-3 control-label no-padding-right" for="form-field-5"> 内容</label><div class="col-sm-9"><textarea class="col-sm-8" id="form-field-5" placeholder="请输入内容..."><

c++读一行数字以换行结束,读一行句子以换行结束,读多行字符串

基础 1、getchar() 头文件#include<cstdio>中 从标准输入读下一个字符。原返回int(如输入a,函数返回97)。 2、getline() 读入一行字符串,以换行结束。 应用:实现输入 1、读一行整数,以换行结束。便输出。 输入: 10 20 30 80 70 输出: 10 20 30 80 70 #include <iostream>#include <c

多行字符串怎么分行写 golang、python

1、golang str := `驾八龙之婉婉兮,载云旗之委蛇。抑志而弭节兮,神高驰之邈邈。奏《九歌》而舞《韶》兮,聊假日以偷乐。陟升皇之赫戏兮,忽临睨夫旧乡。仆夫悲余马怀兮,蜷局顾而不行。乱曰:已矣哉!国无人莫我知兮,又何怀乎故都!既莫足与为美政兮,吾将从彭咸之所居!` 2、python str = """驾八龙之婉婉兮,载云旗之委蛇。抑志而弭节兮,神高驰之邈邈。奏《

根据csv制作多列数据柱形图表并生成html

数据表收录已经过千万了,为了分表,先用sql调出数据然后渲染 csv如下: 代码如下: # -*- coding: utf-8 -*-# pip install pyechartsimport pandas as pdimport numpy as npfrom pyecharts import Bardf = pd.read_csv("monthbybdtype.csv")pri

vim 多行复制粘贴

vim 多行复制粘贴 主要分一下三个步骤: 将光标移动到要复制的文本开始的地方,按v进入可视模式。将光标移动到要复制的文本的结束的地方,按 y 复制。此时 vim 会自动将光标定位到选中文本的开始的地方,并退出可视模式。我移动光标到文本结束的地方,按p粘贴。

为什么越来越多的IT青年转行网络安全?

目前,我国互联网已经从爆发增长期进入平稳发展阶段,同时每年大量计算机相关专业的毕业生涌入就业市场,导致IT行业逐渐趋于饱和状态,甚至出现裁员现象,去年很多大厂都有裁员,不少程序员再就业成了难题。 面对这样的就业环境,IT青年该如何规划未来的职业方向?这的确是一个需要认真思考的问题。 目前现状 如果刚刚毕业,暂时还没有找到合适的工作; 或者已经工作,正在考虑转换一个工作赛道; 亦或是正