GaussDB 行转列、列转行【玩转PB级数仓GaussDB(DWS)】

举报
林欣 发表于 2023/02/28 23:52:39 2023/02/28
【摘要】 行转列、列转行之所以有这个需求,是因为根据人们看问题的角度不同,将数据库中的数据进行不同的结构化后,呈现出来。下面,用学生成绩来举例:站在老师的角度:在录入成绩时,可以按照学科,每科老师都会单独录入每个学生的本科成绩站在学生的角度:学生只关心自己期末考或期中考各科的成绩分别是多少那么如果把老师录入数据作为原始表,那么学生查看自己的成绩就要用到行转列了如果让学生自己上报各科的成绩,然后老师去...

行转列、列转行

之所以有这个需求,是因为根据人们看问题的角度不同,将数据库中的数据进行不同的结构化后,呈现出来。

下面,用学生成绩来举例:

  1. 站在老师的角度:在录入成绩时,可以按照学科,每科老师都会单独录入每个学生的本科成绩
  2. 站在学生的角度:学生只关心自己期末考或期中考各科的成绩分别是多少

那么如果把老师录入数据作为原始表,那么学生查看自己的成绩就要用到行转列了
如果让学生自己上报各科的成绩,然后老师去查自己科的,那就是列转行了

准备数据,开始实战

首先,我们建立一个 student 表,以战国四大名将为例,表包含3个字段

  • name varchar(32)
  • subject varchar(32)
  • score int4(32,0)

使用INSERT语句填充数据后,再使用SELECT语句查询的结果如下(注意:SELECT时需要指定排序列,否则每次查询出来的结果顺序会不一样)

image.png

行转列

意思就是把一行一行的数据,转化为一列一列的数据

静态行转列

静态行专列,需要手动指定每一列的列名,如果存在则取它的值,否则将默认值0赋给它(缺点是不够灵活)

SELECT name,
sum(case when subject='平射' then score else 0 end) as '平射',
sum(case when subject='负重' then score else 0 end) as '负重',
sum(case when subject='马射' then score else 0 end) as '马射',
sum(case when subject='摔跤' then score else 0 end) as '摔跤',
FROM student GROUP BY name

image.png

动态行转列

动态行转列使用 listagg,它是一种聚合函数

  • 优点:函数自动合并所有列,无需使用 case when 逐列手动指定
  • 缺点:行数据被合并到同一列,而不是一组一列
select name,listagg(score,',') within group (order by subject) from student group by 1

无论是group by name,亦或是group by 1都能实现该功能,其结果并无差别

image.png

image.png

列转行

string_to_array 用来将字符串转为数组,第一个参数是待转化的字符串,第二个参数是字符串的分隔符

SELECT string_to_array('1,2,3,4,5', ',')
=> {1,2,3,4,5}

image.png

结合前面用到的 listagg 函数,就是这样

select name,string_to_array(listagg(score,',') within group (order by subject), ',') from student group by 1

image.png

pivot 函数在 GaussDB 里面貌似不能用,具体原因仍正在排查中

image.png

【一起来玩转PB级数仓GaussDB(DWS),分享你的技术经验与体验心得,赢开发者大礼包!】第19期有奖征文火热进行中!

此外,在云声平台提出您的宝贵建议,标题以【云驻计划-定向征文】开头,还有机会赢取额外奖励。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。