hive,mysql,sqlserver 列转行函数,一行转成多行;行转列函数,多行合并成一行

1 篇文章 0 订阅

一、列转行

1.hive 列转行实现方式

原始数据:
create table test(
name string,
subject string
) row format delimited fields terminated by ‘\t’ escaped by ‘\’ stored as textfile;

insert into test(name,subject)values(‘name1’,‘语文’);
insert into test(name,subject)values(‘name2’,‘数学,英语,语文’);
在这里插入图片描述
行转列后(分隔符为","):

select name,t.col as subject from test lateral view explode(split(subject,',')) t as col

在这里插入图片描述

2.mysql 列转行实现方式

其中 join 辅助表 mysql.help_topic 是为了循环到每一个分隔符,截取出数据

select
a.name,
substring_index(substring_index(a.subject(要拆分的字段),',',b.help_topic_id+1),',',-1) 
from 
test(目标表) a
join
mysql.help_topic(数据库通用连续行号表) b
on b.help_topic_id < (length(a.subject(要拆分的字段)) - length(replace(a.subject,',',''))+1)
order by a.name;

2.sqlserver 列转行实现方式

使用xml的方式

select 
a.name,b.subject
from 
(select name,subject=convert(xml,'<root><v>'+replace(subject,',','</v><v>')+'</v></root>') from test) a
outer apply
(select subject=C.v.value('.','nvarchar(100)') from a.subject.nodes('/root/v')C(v)) b

二、行转列

1.hive 行转列实现方式

原始数据:
create table test(
name string,
subject string
) row format delimited fields terminated by ‘\t’ escaped by ‘\’ stored as textfile;

insert into test(name,subject) values(‘name1’,‘语文’);
insert into test(name,subject) values(‘name2’,‘数学’);
insert into test(name,subject) values(‘name2’,‘英语’);
insert into test(name,subject) values(‘name2’,‘语文’);
在这里插入图片描述
行转列后(按照","拼接):

select
name,
concat_ws(',',collect_set(subject)) as subject
from test
group by name

在这里插入图片描述
注:如果不想去重,可以将 collect_set() 换成 collect_list()

2.mysql 行转列实现方式

SELECT
    name,
    GROUP_CONCAT(subject,",") AS subject
FROM
    test
GROUP BY
    name;

2.sqlserver 行转列实现方式

使用xml path实现

select
	name,
	subject = (stuff((select ',' + subject from test where name = a.name for xml path('')),1,1,''))
from
	test a
group by
	name
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值