--行转列的常规套路就是group by+带条件(case when 或if )的聚合
方法一:
select a,max(case when b="A" then c end) col_A,
max(case when b="B" then c end) col_B
from t1 group by a;
方法二:
select a, sum(if(b="A",c,0)) as col_A,
sum(if(b="B",c,0)) as col_B
from t1 group by a;
问题二:如何将结果转成源表?(多列转多行)
问题描述
:
将问题一的结果转成源表,问题一结果表名为 t1_2
思路:对于列转行的问题
==>可以采用union all拼接的方案(每个需要拼接的语句为select a,'A' as b col_a as c from ... 和select a,'A' as b ,col_b as c from...)
select a,b,c
from (select a,'A' as b,col_a as c from t1_2
union all
select a,'B' as b,col_b as c from t1_2 )tmp;
--注:select 'A' as b;
--结果: b
A
问题三:同一部门会有多个绩效,求多行转多列结果
问题描述
:2014 年公司组织架构调整,导致部门出现多个绩效,业务及人员不同,
无法合并算绩效,源表内容如下:
思路:
(1) 行转列的常规套路就是group by+带条件(case when 或if )的聚合
(2) 对于某一列需要(存在需要合并的问题):
一般使用concat_ws(',' ,collect_set(cast( a as string)))
(3)
concat_ws(seperator, string s1, string s2...)函数 常常结合group by与collect_set使用
selecta,max(case when b="A" then c end) col_A,
max(case when b="B" then c end) col_B
from
(selecta,b,concat_ws(",",collect_set(cast(c as string))) as c
from t1 group by a,b )tmp
group by a;
注意:
hive中split、coalesce、collect_list、collect_set函数的用法(1) split:分割字符串函数,将字符串转化为数组split(str, regex)
split('a,b,c,d' , ',') ==> ["a","b","c","d"]
(2) concat(string s1, string s2, string s3)
这个函数能够把字符串类型的数据连接起来,连接的某个元素可以是列值。
如 concat( aa, ':', bb) 就相当于把aa列和bb列用冒号连接起来了,aa:bb。
(3) cast 用法:cast(value as type)
功能:将某个列的值显示的转化为某个类型
例子:cast(age as string) 将int类型的数据转化为了String类型
(4) concat_ws(seperator, string s1, string s2...)
功能:制定分隔符将多个字符串连接起来,实现“列转行”
例子:常常结合group by与collect_set使用
有表结构a string , b string , c int
数据为
c d 1
c d 2
c d 3
e f 4
e f 5
e f 6
想要得到
c d 1,2,3
e f 4,5,6
语句如下
select a, b, concat_ws(',' , collect_set(cast(c as string)))
from table group by a,b;
(5) coalesce:非空查找函数。返回参数中的第一个非空值,如果所有值都为 NULL,那么返回NULL
select coalesce(null,null,22,null); -- 22
(6)collect_list:列出该字段所有的值,不去重,collect_list(col)
select collect_list(id) from table
(7)collect_set,将某字段的值进行去重汇总,产生array类型字段
select col1,col2, concat_ws(‘,’,collect_list(cast(col3 as string))) as col3 From row2col2 group by col1,col2;



