当前位置: 首页 > article >正文

关于优雅的使用SQL多行转多列的记录(doris)

文章目录

  • 应用需求场景
  • 记录过程
      • 1. 准备数据
      • 2. 给数据根据姓名分组,加上序号.
      • 3. 根据name分组成map结构
      • 4. 拆分map

应用需求场景

准备的数据是这样的:
在这里插入图片描述

需要将每个人的成绩显示在一行上,需要的结果如下,但是我的情况是课程有非常多,但不是每个课程都存在。我只想把这个人学习的3个课程列出来,所以这类有个问题,就是每个同学的课程不一定是语文、数学、英语,但是最大不多于3门课。
最终的结果如下:

在这里插入图片描述

记录过程

1. 准备数据

with tmp_a as (
	select 'a' name,'语文' clazz, 80 as score
	union all
	select 'a' name,'高数' clazz, 85 as score
	union all
	select 'a' name,'英语' clazz, 20 as score
	union all
	select 'b' name,'微积分' clazz, 70 as score
	union all
	select 'b' name,'数学' clazz, 75 as score
	union all
	select 'b' name,'现代' clazz, 71 as score
	union all
	select 'c' name,'物理' clazz, 70 as score
	union all
	select 'c' name,'音乐' clazz, 75 as score
	union all
	select 'c' name,'体育' clazz, 71 as score
)
select * from tmp_a;

2. 给数据根据姓名分组,加上序号.

with tmp_a as (
	select 'a' name,'语文' clazz, 80 as score
	union all
	select 'a' name,'高数' clazz, 85 as score
	union all
	select 'a' name,'英语' clazz, 20 as score
	union all
	select 'b' name,'微积分' clazz, 70 as score
	union all
	select 'b' name,'数学' clazz, 75 as score
	union all
	select 'b' name,'现代' clazz, 71 as score
	union all
	select 'c' name,'物理' clazz, 70 as score
	union all
	select 'c' name,'音乐' clazz, 75 as score
	union all
	select 'c' name,'体育' clazz, 71 as score
)
select *,row_number() over(partition by name order by clazz) rk
from tmp_a;

在这里插入图片描述

3. 根据name分组成map结构

注意:这里用到的map_agg是doris里面的,其他数据库不确定有没有。
map_agg(key,value) 这样使用的,这里将序号作为key,后面方便统一取值。

with tmp_a as (
	select 'a' name,'语文' clazz, 80 as score
	union all
	select 'a' name,'高数' clazz, 85 as score
	union all
	select 'a' name,'英语' clazz, 20 as score
	union all
	select 'b' name,'微积分' clazz, 70 as score
	union all
	select 'b' name,'数学' clazz, 75 as score
	union all
	select 'b' name,'现代' clazz, 71 as score
	union all
	select 'c' name,'物理' clazz, 70 as score
	union all
	select 'c' name,'音乐' clazz, 75 as score
	union all
	select 'c' name,'体育' clazz, 71 as score
),
tmp_b as (
select *,row_number() over(partition by name order by clazz) rk
from tmp_a
)
select name,
map_agg(rk,clazz) clazz,
map_agg(rk,score) score
from tmp_b group by name;

在这里插入图片描述

4. 拆分map

这里必须写死,没其他好方法,而且列是固定写死的。
clazz[1] 这里的1就是上面的放进去的rk的值,由于我们每个人最多只有3门课,
所以可以就取 clazz[1] clazz[2] clazz[3]

with tmp_a as (
	select 'a' name,'语文' clazz, 80 as score
	union all
	select 'a' name,'高数' clazz, 85 as score
	union all
	select 'a' name,'英语' clazz, 20 as score
	union all
	select 'b' name,'微积分' clazz, 70 as score
	union all
	select 'b' name,'数学' clazz, 75 as score
	union all
	select 'b' name,'现代' clazz, 71 as score
	union all
	select 'c' name,'物理' clazz, 70 as score
	union all
	select 'c' name,'音乐' clazz, 75 as score
	union all
	select 'c' name,'体育' clazz, 71 as score
),
tmp_b as (
select *,row_number() over(partition by name order by clazz) rk
from tmp_a
), 
tmp_c as (
select name,
map_agg(rk,clazz) clazz,
map_agg(rk,score) score
from tmp_b group by name
)
select name,
clazz[1] clazz_1,score[1] score_1,
clazz[2] clazz_2,score[2] score_2,
clazz[3] clazz_3,score[3] score_3
from tmp_c

最终显示如下,中午没睡觉想了一个中午,脑壳痛,看起来好像也不太复杂,
如果每个人的课程增加时,只需要在最后添加一行即可。

在这里插入图片描述


http://www.kler.cn/news/161126.html

相关文章:

  • 如何使用phpStudy本地快速搭建网站并内网穿透远程访问
  • 如何使用内网穿透工具实现公网访问GeoServe Web管理界面
  • LeetCode刷题--- 计算布尔二叉树的值
  • 这些Java并发容器,你都了解吗?
  • 手写VUE后台管理系统7 - 整合Less样式
  • Inno Setup使用
  • supervisor杀死不掉程序的问题分析
  • (动手学习深度学习)第13章 实战kaggle竞赛:树叶分类
  • 4G基站BBU、RRU、核心网设备
  • VUE+THREE.JS 点击模型相机缓入查看模型相关信息
  • 云计算生成式 -给你不一样的音乐推荐新体验
  • 英伟达显卡系列与架构、代表产品
  • 基于JavaScript的jimp库处理图片,添加绘制点
  • 【华为od】存在一个m*n的二维数组,其成员取值范围为0,1。其中值为1的元素具备扩散性,每经过1S,将上下左右值为0的元素同化为1。
  • 要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 23 章:命名实体识别提示
  • 《QDebug 2023年11月》
  • 要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 7 章:让我们想一想 提示语
  • 背包问题学习
  • 数据结构与算法编程题50
  • NC 比telnet 强大网络命令
  • 我有才打造知识付费小程序
  • simulink trigger模块使用——多种调用案例分析
  • 出海电商中的技术护航:Socks5代理与代理IP的应用
  • 第16关 革新云计算:如何利用弹性容器与托管K8S实现极速服务POD扩缩容
  • JVM垃圾回收机制GC
  • Spring cloud - gateway
  • 【微软技术栈】基于任务的异步编程
  • 简单3D姿态基线模型网络架构与验证【SIM】
  • 生成器简述 - python 基础进阶知识点补全(一)
  • 【C++】多线程(二):std::mutex std::atomic的使用