GaussDB 行转列、列转行【玩转PB级数仓GaussDB(DWS)】
【摘要】 行转列、列转行之所以有这个需求,是因为根据人们看问题的角度不同,将数据库中的数据进行不同的结构化后,呈现出来。下面,用学生成绩来举例:站在老师的角度:在录入成绩时,可以按照学科,每科老师都会单独录入每个学生的本科成绩站在学生的角度:学生只关心自己期末考或期中考各科的成绩分别是多少那么如果把老师录入数据作为原始表,那么学生查看自己的成绩就要用到行转列了如果让学生自己上报各科的成绩,然后老师去...
行转列、列转行
之所以有这个需求,是因为根据人们看问题的角度不同,将数据库中的数据进行不同的结构化后,呈现出来。
下面,用学生成绩来举例:
- 站在老师的角度:在录入成绩时,可以按照学科,每科老师都会单独录入每个学生的本科成绩
- 站在学生的角度:学生只关心自己期末考或期中考各科的成绩分别是多少
那么如果把老师录入数据作为原始表,那么学生查看自己的成绩就要用到行转列了
如果让学生自己上报各科的成绩,然后老师去查自己科的,那就是列转行了
准备数据,开始实战
首先,我们建立一个 student 表,以战国四大名将为例,表包含3个字段
- name varchar(32)
- subject varchar(32)
- score int4(32,0)
使用INSERT
语句填充数据后,再使用SELECT语句查询的结果如下(注意:SELECT时需要指定排序列,否则每次查询出来的结果顺序会不一样)
行转列
意思就是把一行一行的数据,转化为一列一列的数据
静态行转列
静态行专列,需要手动指定每一列的列名,如果存在则取它的值,否则将默认值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
动态行转列
动态行转列使用 listagg,它是一种聚合函数
- 优点:函数自动合并所有列,无需使用
case when
逐列手动指定 - 缺点:行数据被合并到同一列,而不是一组一列
select name,listagg(score,',') within group (order by subject) from student group by 1
无论是group by name
,亦或是group by 1
都能实现该功能,其结果并无差别
列转行
string_to_array 用来将字符串转为数组,第一个参数是待转化的字符串,第二个参数是字符串的分隔符
SELECT string_to_array('1,2,3,4,5', ',')
=> {1,2,3,4,5}
结合前面用到的 listagg 函数,就是这样
select name,string_to_array(listagg(score,',') within group (order by subject), ',') from student group by 1
pivot 函数在 GaussDB 里面貌似不能用,具体原因仍正在排查中
【一起来玩转PB级数仓GaussDB(DWS),分享你的技术经验与体验心得,赢开发者大礼包!】第19期有奖征文火热进行中!
此外,在云声平台提出您的宝贵建议,标题以【云驻计划-定向征文】开头,还有机会赢取额外奖励。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)