实例详解构建数仓中的行列转换

本文分享自华为云社区《GaussDB数据库SQL系列-行列转换》,作者:Gauss 松鼠会小助手 2。
一、前言
在构建数据仓库或做数据分析时,需要对原始数据的结构进行一定的处理,有时涉及到“行转列”,有时涉及到“列转行”,那么这两个转换的方式具体是什么,有什么差异,怎么实现,今天我们将以 GaussDB 数据库为例,给大家做一下讲解。
二、简述
1、行转列概念
即将多行一列数据转为一行多列显示。通常转化后将某一列分类后的值作为新的列名,将此值对应的多行数据显示成一行。

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

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

2)静态行转列
复制代码
使用 sum、case when 的方式:

3)行转列(结果值:拼接式)
使用 listagg within group:
复制代码

4)动态行转列(拼接 SQL 式)
通过“listagg + 创建 FUNCTION + VIEW”的方式实现
复制代码

Tip:请注意 SQL 拼写时的单引号、双引号。
2、列转行示例
1)创建实验表(复用前面的测试数据)
复制代码

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

四、小结
行列互转在一些数据库使用场景中经常用到,比如数据分析、数仓建设等。但不同的数据库软件有着不同处理方式,但是行列换的基本思路是一致的。本文主要是以 GaussDB 数据为平台,为大家做了简单的讲述 ,欢迎测试。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/3e03aefd4e5d54bce227667f9】。文章转载请联系作者。
评论