SQL——行列转换

行转列

将分散在多行的数据,拼接成一个新的列

concat(str1, str2, ... strN):将传入的任意个字符串拼接后返回

concat_ws(separator, [string | array(string)]+) 只能连接 string 列表或 array<string> 数组

用法1——连接 string 或 array

select concat_ws('&','uuu','kkk','abc');

select concat_ws('$$',array('12','11','66','44','99'));

用法2——连接一个字段的多个值,需要配合 collect_set 使用!

select concat_ws('|',collect_set(name))

用法3——连接多个字段的值,可直接使用!

select concat_ws(',',name,age)

collect_set:传入一个字段,将字段中所有的值,去重后返回一个array

collect_list:和collect_set类似,但是不去重,返回一个array

 

经典案例:

将血型和星座都相同的人拼接到一起:

name

constellation

blood_type

孙悟空

白羊座

A

大海

射手座

A

宋宋

白羊座

B

猪八戒

白羊座

A

凤姐

 射手座

A

  ===》

射手座,A

大海|凤姐

白羊座,A 

孙悟空|猪八戒

白羊座,B

宋宋

代码实现:

select info,concat_ws('|',collect_set(name))

from (

select name,concat_ws(',',constellation,blood_type) info

from person_info

)t1

group by info;


列转行 (lateral view explode)

将一个数据类型为array的列中的元素拆分为多行

select movie,cate from movie_info lateral view explode(category) t1 as cate;

经典案例:

tb1:

city

loc

北京

长城

北京

故宫

北京

颐和园

上海

外滩

上海

陆家嘴

上海

南京路

上海

崇明岛

 

 

 

 

 

《===》

 

tb2:

 

 

city

locs

北京

长城,故宫,颐和园

上海

外滩,陆家嘴,南京路,崇明岛

比较:

tb1--->tb2:【行转列】

selelct

city,

concat_ws(',',colect_set(loc)) locs

from tb1

group by city;

----------------------------------------------------------------

tb2--->tb1:【列转行】

select

city,

loc

from tb2 lateral view explode(split(locs,',')) tmp as loc;

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值