行列转换问题---行转列及列转行

行列转换问题---行转列及列转行_第1张图片

问题一:多行转多列
问题描述 :将上述表内容转为如下输出结果所示:
行列转换问题---行转列及列转行_第2张图片

 --行转列的常规套路就是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;
问题二:如何将结果转成源表?(多列转多行)
行列转换问题---行转列及列转行_第3张图片
问题描述 将问题一的结果转成源表,问题一结果表名为 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 年公司组织架构调整,导致部门出现多个绩效,业务及人员不同,
无法合并算绩效,源表内容如下:
行列转换问题---行转列及列转行_第4张图片
思路:
(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;

 

你可能感兴趣的:(经典SQL题,hive,SQL,经典SQL题)