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

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

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

一、基础数据

有学生成绩表,包含学生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     |
+-------------+----------+--------+

二、函数介绍

  • sum
  • case

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

原始数据中是一个竖表,每个学生的每个学科一行数据,对其转换成一张横表,即表中学生id为主键,包含语文、数学、英语三列,列值为对应学科分数。

期望结果

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

1.生成三个科目的成绩列

使用case when语句,对三个科目依次判断,是对应科目的取对应科目成绩,不是对应科目不取值。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select student_id,
       case when subject = '语文' then score end as yuwen,
       case when subject = '数学' then score end as shuxue,
       case when subject = '英语' then score end as yingyu
from t_student_score

执行结果

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

2.聚合,将每个学生的科目放到同一行

使用聚合函数,将学生不同科目成绩压缩到同一行。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

执行结果

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

四、数据准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--建表语句
CREATE TABLE IF NOT EXISTS t_student_score
(
    student_id string, -- 学生id
    subject    string, -- 学科
    score      bigint  -- 分数
)
    COMMENT '学生成绩表';

insert into t_student_score
values ('001', '语文', 89),
       ('001', '数学', 95),
       ('001', '英语', 77),
       ('002', '语文', 92),
       ('002', '数学', 83),
       ('002', '英语', 97),
       ('003', '语文', 81),
       ('003', '数学', 94),
       ('003', '英语', 88);

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
行列转换-横表竖表互相转换
原始数据中是一个竖表,每个学生的每个学科一行数据,对其转换成一张横表,即表中学生id为主键,包含语文、数学、英语三列,列值为对应学科分数。
数据仓库晨曦
2024/09/12
1850
行列转换-横表竖表互相转换
P1093 奖学金
题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答
attack
2018/04/13
7530
列转行-多列转多行(横表变竖表)
原始数据为一张横表,分别有三列成绩列,想要转成竖表,需要转换成三列分别为 学生id、学科、成绩,转换完成之后学生id将不再是主键。
数据仓库晨曦
2024/08/19
2480
列转行-多列转多行(横表变竖表)
常见大数据面试SQL-有序行转列
有学生各学科分数表,记录了学生的各科分数,请按照学生粒度,生成两列数据分别为学科和分数,要求学科内的顺序与分数顺序一致。
数据仓库晨曦
2024/08/01
1140
常见大数据面试SQL-有序行转列
Hive案例01-行列转换
其中字段意义: id(int) sid(int) subject(string) score(int) 分别代表: 本条记录的ID 学生ID 科目 成绩 需求: 求数学成绩比语文成绩好的学生的ID
CoderJed
2018/09/13
2.3K0
Hive案例01-行列转换
SQL中进行转列的几种方式
在很多笔试的程序员中会有很多写SQL的情况,其中很多时候会考察行转列。那么这个时候如果能写出来几种行转列的SQL,会给面试官留下比较好的印象。
海仔
2019/08/06
2.9K0
SQL中进行转列的几种方式
30道经典SQL面试题讲解(1-10)
本篇节选自书籍《对比Excel,轻松学习SQL数据分析》一书,主要讲解数据分析面试中常见的30道SQL面试题。
张俊红
2020/12/16
2.2K0
【Java面向对象】学习Java经典必刷题库
t003   张杰    男  28  Java                                              
陶然同学
2023/02/27
5000
Python入门(四):函数、类、模块
是能重用的程序段,给一块代码起一个名字,然后在其它地方使用函数名字重复调用这块代码。
披头
2019/12/26
6700
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
python 【实例100】
输入开启数字和结束数字,打印区间内的所有素数:比如:输入11和25 ,打印11~25的所有素数,包括25 素数:如果数字只能被1和自己整除就是素数,否则不是素数:比如3是素数、4不是素数
MIKE笔记
2023/03/23
8890
python 【实例100】
【Apache Doris】行列转换 最佳实践指南
行列转换就是如下图所示两种展示形式的互相转换行转列我们来看一个简单的例子,我们要把下面第一个表格的数据转换成下边第二个表格的样式
一臻数据
2024/12/24
3060
【Apache Doris】行列转换 最佳实践指南
Hive考试练习题(参考题解)
请打开【VMware Workstation Pro】中的【linux1】环境,登录账号【root】密码【root】。 
红目香薰
2022/11/30
4540
Hive考试练习题(参考题解)
学习Java必刷编程练习题
现有一个Map集合,map中学号(String)为key,学生(Student)为value,分别使用keySet方式  和entrySet的方式 打印集合中每一个Student对象的name属性和age属性
陶然同学
2023/02/27
7760
MySQL case when 用法
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END:枚举这个字段所有可能的值*
Java编程指南
2020/07/02
2.3K0
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
有学生成绩表,包含学生姓名、学科、成绩三个字段,请用一条SQL查询出每个学科排名第三名的学生,他的学科成绩、总成绩、以及总排名。
数据仓库晨曦
2024/07/12
2470
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
SQL常见面试题目
一.学生表(学生id,姓名,性别,分数)student(s_id,name,sex,score) 班级表(班级id,班级名称)class(c_id,c_name) 学生班级表(班级id,学生id)student_class(s_id,c_id)(考察三表联查) 1.查询一班得分在80分以上的学生。
测试之道
2021/03/04
1.4K0
5分钟搞懂MySQL - 行转列
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里
陈哈哈
2022/06/15
3.4K0
5分钟搞懂MySQL - 行转列
【数据库】MySQL经典面试题(练习)
【数据库】MySQL经典面试题(练习) 一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条) 要求结果数据: 原始数据: CREATE TA
Java帮帮
2018/03/15
1.7K0
【数据库】MySQL经典面试题(练习)
MySQL存储过程_触发器_游标——Baidu Comate
红目香薰
2024/05/26
1210
相关推荐
行列转换-横表竖表互相转换
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验