请教一个行列转置的问题,类似于excel中的透视表,下图中的数据,有办法用hive sql做出来吗?我能想到的方法是用多个union 把他们按照不同的职位合并到一起,还有其他的方法吗?
右边的6个列每2个列一组,加一个静态的职位字段,一共三个列,用union all拼接起来,再用字符串聚合把职位拼起来。这个方法应该是可用的。
至于用lateral view explode进行行列转换的方法,我晚上回去再研究下
弄出来了
---测试表
CREATE TABLE TEST_TABLE2 (gs varchar(1),
zybh int,zyxm varchar(10),
zgbh int,zgxm varchar(10),
jlbh int,jlxm varchar(10));
---测试数据
insert into TEST_TABLE2 (GS, ZYBH, ZYXM, ZGBH, ZGXM, JLBH, JLXM)
values ('A', 1, '张三', 1, '张三', 2, '李四');
insert into TEST_TABLE2 (GS, ZYBH, ZYXM, ZGBH, ZGXM, JLBH, JLXM)
values ('A', 3, '王五', 4, '赵六', 3, '王五');
---查询sql
select gs ,xcode ,rcode ,concat_ws(',',collect_set(substr(rname,1,2))) as zw
from (
select gs, map("ZYBH", ZYBH
, "ZGBH", ZGBH
, "JLBH", JLBH) as rybh,map("ZYXM", ZYXM
, "ZGXM", ZGXM
, "JLXM", JLXM) as ryxm
from TEST_TABLE2 ) x
lateral view explode(rybh) exptbl1 as rname, rcode
lateral view explode(ryxm) exptbl1 as xname, xcode
where substr(rname,1,2)=substr(xname,1,2)
group by gs,xcode,rcode
实测截图
很抱歉做不到的,你这合并一般结果可以使用 collect_list(组函数)或者 concat_ws(单行函数),但是你这上面数据和下面数据基本上只有公司字段是相同的其他都不同,更别提使用union了,根本就是做不到,职位你还要从字段名截取,而且职位的长度你根本无法控制,人员姓名和编号还要从每条数据的多个字段里面获取,获取还要在进行去重处理等等