GaussDB数据库SQL系列-行列转换
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数据为平台,为大家做了简单的讲述 ,欢迎测试。
——结束

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
EasyPhoto:基于 SD WebUI 的艺术照生成插件来啦!
作者 :wuziheng 背景介绍 最近,基于生成式AI技术批量产出真/像/美的个人写真应用非常受欢迎。同时,随着 Stable Diffusion 领域开源社区的快速发展,社区也涌现了类似 FaceChain 的开源项目,帮助开发者开发个性化的真人写真生成应用。越来越多开发者对这个方向投来关注,希望得到更多灵活的开发方式。 EasyPhoto项目介绍 作为FaceChain-Inpaint功能的开发团队,我们快速上线了一款基于 SD WebUI 插件生态的个性化写真生成开源插件 EasyPhoto。这款插件允许用户通过上传几张同一个人的照片,快速训练Lora模型,然后结合用户自定义的模板图片,生成 真/像/美的写真图片。 图1 项目地址: https://github.com/aigc-apps/sd-webui-EasyPhoto 欢迎大家多多提ISSUE,一同优化,让每个AIGCer都拥有自己的AI写真相机! 原理介绍 AI真人写真是一个基于 StableDiffusion和AI人脸相关技术,实现的定制化人像Lora模型训练和指定图像生成链路的集合,这里我们简单介绍我们在Easy...
- 下一篇
探索GreatADM:如何快速定义监控
引文 在数据库运维过程中,所使用的运维管理平台是否存在这样的问题: 1、默认监控粒度不够,业务需要更细颗粒度的监控数据。 2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。 3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固化,难以应对多样化的监控需求。 4、只监控系统关键指标,屏蔽不必要的指标,优化CPU消耗、网络、采集数据量等,减少资源消耗,提升系统性能。 在数据库运维过程中,用户或者DBA经常会因为管理平台监控面板无法配置,或者监控模板固化,监控模板中没有所关注的指标项,而不得已弃用部分管理平台,进而自建监控或者基于自身业务自定义一批运维监控脚本,来实现数据库或者主机的多样化监控需求。 但这些脚本往往出自不同DBA之手,监控脚本的管理、更新和维护,以及风险评估给数据库的稳定运行带来了新的风险,而且脚本的输出结果需要DBA周期检查分析,展示上也不够直观。今天我们来看下GreatADM是如何解决上述问题的。 一、GreatADM的监控介绍 GreatADM提供灵活的自定义监控配置方法,支持通用的prometheus+grafana的规范,用户可以按照实际业务上的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- Mario游戏-低调大师作品
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路