GaussDB数据库SQL系列-行列转换

news2024/11/16 17:44:17

一、前言

二、简述

1、行转列概念

2、列转行概念

三、GaussDB数据库的行列转行实验示例

1、行转列示例

1)创建实验表(行存表)

2)静态行转列

3)行转列(结果值:拼接式)

4)动态行转列(拼接SQL式)

2、列转行示例

1)创建实验表(复用前面的测试数据)

2)使用union all,将各科目(数学、英语、语文)整合为一列

四、小结

一、前言

在构建数据仓库或做数据分析时,需要对原始数据的结构进行一定的处理,有时涉及到“行转列”,有时涉及到“列转行”,那么这两个转换的方式具体是什么,有什么差异,怎么实现,今天我们将以GaussDB数据库为例,给大家做一下讲解。

二、简述

1、行转列概念

即将多行一列数据转为一行多列显示。通常转化后将某一列分类后的值作为新的列名,将此值对应的多行数据显示成一行。

2、列转行概念

即将一行多列数据转成多行一列显示。通常将转化后的列名为某一行中某一列的值,来识别原先对应的数据。

三、GaussDB数据库的行列转行实验示例

用一张学生成绩来举例:从老师的角度,在录入成绩时,每科老师都会单独录入每个学生的本科成绩。而从学生的角度,学生只关心自己各科的成绩分别是多少。所以如果把老师录入数据作为原始表,那么学生查看自己的成绩时就要用到行转列,如果让学生上报自己各科的成绩,然后老师去查对应学科的学生考试成绩时,那就是列转行了。

1、行转列示例

1)创建实验表(行存表)

--创建实验表(行存表)
CREATE TABLE grade(
name VARCHAR(10)
,course VARCHAR(10)
,score INT);

--初始化测试数据
INSERT INTO grade VALUES ('张三','数学',80);
INSERT INTO grade VALUES ('张三','英语',88);
INSERT INTO grade VALUES ('张三','语文',95);
INSERT INTO grade VALUES ('李四','数学',88);
INSERT INTO grade VALUES ('李四','英语',70);
INSERT INTO grade VALUES ('李四','语文',93);

--查看结果
SELECT * FROM grade ORDER BY course;

2)静态行转列

使用sum、case when的方式:

--静态行转列
SELECT name 
      ,sum(case when course = '数学' then score else 0 end) AS "数学"
      ,sum(case when course = '英语' then score else 0 end) AS 英语
      ,sum(case when course = '语文' then score else 0 end) AS 语文
FROM grade 
GROUP BY name;

3)行转列(结果值:拼接式)

使用listagg within group:

--行转列(结果值:拼接式)
SELECT name, LISTAGG(score,',') WITHIN GROUP (ORDER BY course) FROM grade GROUP BY name;

4)动态行转列(拼接SQL式)

通过“listagg + 创建FUNCTION + VIEW”的方式实现

--动态行转列(SQL拼接式)
SELECT listagg(concat('SUM(CASE WHEN course = ''', course, ''' THEN score ELSE 0 END) AS "', course,'"'),',') WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);

--concat_text的结果:
SUM(CASE WHEN course = '数学' THEN score ELSE 0 END) AS "数学",SUM(CASE WHEN course = '英语' THEN score ELSE 0 END) AS "英语",SUM(CASE WHEN course = '语文' THEN score ELSE 0 END) AS "语文"

--创建一个函数。
CREATE OR REPLACE FUNCTION fun_test()
RETURNS VOID
LANGUAGE SQL
AS $$ DECLARE
s_sql text;
rec record;
BEGIN        
    s_sql := 'SELECT listagg(CONCAT(''SUM(CASE WHEN course = '''''', course, '''''' THEN score ELSE 0 END) AS "'', course, ''"'' ),'','' ) WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);'; 
    EXECUTE s_sql INTO rec;    
	s_sql := 'DROP VIEW IF EXISTS v_score; CREATE VIEW v_score AS SELECT name, ' || rec.concat_text || ' FROM grade GROUP BY name;';
	EXECUTE s_sql;
END $$;

--调用
CALL fun_test();

--查看执行结果
select * from v_score;

Tip:请注意SQL拼写时的英文单引号、双引号。

2、列转行示例

1)创建实验表(复用前面的测试数据)

--创建实验表(复用前面的测试数据)
CREATE TABLE grade1 AS 
SELECT name 
      ,sum(case when course = '数学' then score else 0 end) AS "数学"
      ,sum(case when course = '英语' then score else 0 end) AS 英语
      ,sum(case when course = '语文' then score else 0 end) AS 语文
FROM grade 
GROUP BY name;

--查看结果
SELECT * FROM grade1;

2)使用union all,将各科目(数学、英语、语文)整合为一列

--使用union all,将各科目(数学、英语、语文)整合为一列
SELECT * FROM 
(
SELECT name, '数学' AS course, 数学 AS score FROM grade1
union all
SELECT name, '英语' AS course, 英语 AS score FROM grade1
union all
SELECT name, '语文' AS course, 语文  AS score FROM grade1
) 
order by name;

四、小结

行列互转在一些数据库使用场景中经常用到,比如数据分析、数仓建设等。但不同的数据库软件有着不同处理方式,但是行列换的基本思路是一致的。本文主要是以GaussDB数据为平台,为大家做了简单的讲述 ,欢迎测试。

——结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS CHATGPT

由于近几天来,我的手机短信不断收到百度公司对于“文心一言”大模型的体验邀请(真是不胜其烦)!!所以我就抱着试试看的态度点开了文心一言的链接:文心一言 目前看来,有以下两点与chatgpt是有比较…

Plex私人影音云盘搭建教程:本地电脑使用内网穿透实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

《中国人工智能人才学习白皮书》发布!

Datawhale发布 2023 中国人工智能人才学习白皮书 I 导读 日前,由 Datawhale 联合上海白玉兰开源开放研究院、和鲸科技、江南大学教育信息化研究中心编写的《2023中国人工智能人才学习白皮书》(下简称“白皮书”)于8月24日正式发布。 学界大咖…

谈谈对OceanBase单机分布式一体化的思考

关于作者: 杨传辉,OceanBase CTO。2010 年作为创始成员之一加入 OceanBase 团队,主导了 OceanBase 历次架构设计和技术研发,从无到有实现 OceanBase 在蚂蚁集团全面落地。同时,他也主导了两次 OceanBase TPC-C 测试并打…

北约报告:2023-2043,下一代量子技术的发展与挑战

“当今的新技术正在以令人眼花缭乱的速度发展,我们所有人都可以在负责任且合乎道德的方式开发和部署新技术方面发挥作用。” ——这是副秘书长Mircea Geoană在2023年3月22日、在布鲁塞尔发布《北约科学技术组织2023-2043年趋势报告》时传达的信息。 Geoană先生强调…

【Python】使用python处理excel表格数据

Python有许多库可以用于处理Excel表格数据,其中最常用的是pandas和openpyxl。 pandas库 pandas库是一个非常强大的用于数据分析和操作的Python库。它支持处理各种数据类型,包括Excel表格数据。 首先需要安装pandas库,可以通过以下命令在终…

项目介绍:《Online ChatRoom》网页聊天室 — Spring Boot、MyBatis、MySQL和WebSocket的奇妙融合

在当今数字化社会,即时通讯已成为人们生活中不可或缺的一部分。为了满足这一需求,我开发了一个名为"WeTalk"的聊天室项目,该项目基于Spring Boot、MyBatis、MySQL和WebSocket技术,为用户提供了一个实时交流的平台。在本…

Noah-MP模型+Python

目的使参会学员熟悉陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用;深入理解Noah-MP 5.0模型的原理,掌握Noah-MP模型(2023年最新发布的5.0版本)所需的系统环境与编译环境的搭建方法及模型实践运行,熟…

Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘

最近在用django框架开发后端时,在运行 $python manage.py makemigrations 命令时,报了以上错误,错误显示连接mysql数据库失败,查看了mysql数据库初始化配置文件my.cnf,我的mysql.sock文件存放路径配置在了/usr/local…

【方案】河道漂浮物检测:基于视频智能分析/AI算法智能分析技术在河道整治场景的应用

随着社会的发展和人们生活水平的进步,水污染问题也越来越严重,水资源监管和治理成为城市发展的一大困扰,水面上的漂浮垃圾不仅会影响河道生态安全并阻碍船舶航行,还会影响人们的身体健康。 TSINGSEEE青犀AI智能分析平台在环保场景…

MySql时间

一、查询 查询mysql当前时间 SELECT now();查询mysql时区 show variables like%time_zone;二、修改时区 set global time_zone 8:00; (修改mysql全局时区为北京时间,也就是我们所在的东8区,需要root权限) set time_zone 8:0…

cad怎么保存成jpg图片?一分钟教会你转换

将CAD文件转换成JPG图片可以帮助我们将文件在更广泛的设备和应用程序中使用,因为JPG格式是一种广泛支持的图像格式。这意味着,无论您使用的是电脑、手机还是平板电脑,都可以轻松地查看和编辑这些图像。另外,JPG格式可以通过压缩图…

C++:重载运算符

1.重载不能改变运算符运算的对象个数 2.重载不能改变运算符的优先级别 3.重载不能改变运算符的结合性 4.重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象,或类对象的引用 5.重载运算符的功能要类似于该运算符作用…

长胜证券:个税+房贷新政出台 AI+应用落地持续推进

昨日,两市股指盘中弱势震荡下探。到收盘,沪指跌0.55%报3119.88点,深成指跌0.61%报10418.21点,创业板指跌0.69%报2102.57点;两市算计成交8282亿元,北向资金净卖出约43亿元。行业方面,地产、券商板…

干货!耽误你1分钟,教你怎么查自己的流量卡是什么卡?

很多朋友都想购买一张正规的号卡,但是在网上一搜流量卡,五花八门,各式各样,那么,我们该如何辨别流量卡呢。 ​ 从种类上来看,网上的流量卡一共分为两种:号卡和物联卡 物联卡不用多说&#xff0…

数据库介绍

一.什么是数据库? 通俗的来讲数据库就是用来存放数据的地方,可以理解为和冰箱一样 官方: 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建,…

华为数通方向HCIP-DataCom H12-821题库(单选题:201-220)

第201题 BGP 协议用​​ beer default-route-advertise​​ 命令来给邻居发布缺省路由,那么以下关于本地 BGP 路由表变化的描述,正确的是哪一项? A、在本地 BGP 路由表中生成一条活跃的缺省路由并下发给路由表 B、在本地 BGP 路由表中生成一条不活跃的缺省路由,但不下发给…

文心一言放开,百度搜索AI最强评测

今天凌晨,百度突然官宣,文心一言全面开放,人人都能上手用了! 现在,只需登陆「文心一言官网」即可体验。 真正重磅的是,一批全新重构的百度AI原生应用,包括百度搜索、「文心一言APP」、输入法、百…

C语言每日一练--Day(16)

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字:寻找奇数 峰值 二分查找 💓博主csdn个人主页:小…

java比较器、迭代器和枚举类型详解

文章目录 1. 比较器1.1 Comparable实例:对自定义对象进行排序 1.2 Comparator实例:对自定义对象进行排序 1.3 equals1.3.1 equals介绍1.3.2 详解 2. 迭代器2.1 Iterator2.2 ListIterator 3. 枚举3.1 枚举访问3.1 枚举细节 1. 比较器 比较器指的是集合存…