-- # a -- 年份 b -- 部门 c -- 绩效得分

-- 建表
CREATE TABLE t1 ( a string,b string,c DOUBLE);

INSERT INTO t1 VALUES ('2014','B',9), ('2015','A',8), ('2014','A',10), ('2015','B',7);

1)多行转多列

思路:年份分组,取出不同部门的绩效 年份(分组) - 部门A - 部门B

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;

此处也可通过部门分组,取出不同年份的部门成绩,列名为 部门(分组)-年份(14年)-年份(15年)

SELECT b,
       max(CASE
               WHEN a = '2014' THEN c
           END) col_2014,
       max(CASE
               WHEN a = '2015' THEN c
           END) col_2015
FROM t1
GROUP BY b;

2)多列转多行

基本思路:通过单独查出不同部门的数据,union all不同部门,查abc

CREATE TABLE t1_2 AS
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,
       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;

3,同一部门会有多个绩效,多行转多列 表名t1_3

2014 年公司组织架构调整,导致部门出现多个绩效,业务及人员不同,无法合并算绩效,源表内容如下:

2014 B 9 2015 A 8 2014 A 10 2015 B 7 2014 B 6

-- 思路:使用collect_set函数收集为一个集合,concat_ws然后保存为数组 **collect_set 为去重 ** concat_ws 通过逗号连接

CREATE TABLE t1_3 AS SELECT * FROM t1;

INSERT INTO t1_3 VALUES('2015','B',7),('2014','B',6);

select 
    a,
    max(CASE
        WHEN b="A" THEN c
    END) col_A,
    max(CASE
        WHEN b="B" THEN c
    END) col_B
FROM (select a,
      b,
      concat_ws(",",collect_set(cast(c AS string))) AS c
      FROM t1_3
      GROUP BY a,
               b)tmp
GROUP BY a;