1. 程式人生 > >hive語句實現列轉行

hive語句實現列轉行

建表語句

CREATE  TABLE XXXX表(
  evel_id string DEFAULT NULL COMMENT 'xxxxid', 
  object_id string DEFAULT NULL COMMENT '所屬物件', 
  object_name string DEFAULT NULL COMMENT '所屬物件名稱', 
  dept_id string DEFAULT NULL COMMENT '單位編碼', 
  dept_name string DEFAULT NULL COMMENT '單位名稱', 
  ......省略一堆欄位
  rcount bigint DEFAULT NULL COMMENT '記錄屬性總數 ', 
  qcount bigint DEFAULT NULL COMMENT '問題屬性總數', 
  nqcount bigint DEFAULT NULL COMMENT '新增問題總數 ', 
  sqcount bigint DEFAULT NULL COMMENT '解決問題總數 ', 
  score decimal(5,2) DEFAULT NULL COMMENT '屬性分數', 
  create_date timestamp DEFAULT NULL COMMENT '建立時間', 
  update_date timestamp DEFAULT NULL COMMENT '更新時間', 
  create_person string DEFAULT NULL COMMENT '建立人'
)
COMMENT 'XXXX表'

原資料部分展示:
在這裡插入圖片描述

Oracle中列轉行語法,使用 unpivot函式

unpivot(欄位屬性 for 欄位別名 in(欄位1 as 別名1,欄位2 as 別名2 …))

select EPT_NAME as DEPT_NAME,
       OBJECT_NAME,
       OBJ_COUNT,
       ROUND(SUM(SCORE) / COUNT(*), 2) as SCORE
  from XXXX表
       unpivot(SCORE for OBJ_COUNT in(RCOUNT as '屬性總數',
                                      QCOUNT as '問題屬性總數',
                                      SCORE as '得分'))
 where 1 = 1
   AND SYS_ID = '1234567890'
 GROUP BY OBJECT_NAME, DEPT_NAME, OBJ_COUNT
 ORDER BY OBJECT_NAME;

實現效果:
在這裡插入圖片描述

hive中列轉行語法,使用explode函式

因為LATERAL VIEW explode(split(欄位,’,’))是將一個欄位拆分展示為多條資料顯示,所以使用CONCAT_WS語句,將多個欄位拼接起來,可以滿足將一條資料多個特定欄位展示為多條資料一個特定欄位。
LATERAL VIEW explode(split(CONCAT_WS(’,’,to_char(RCOUNT),to_char(QCOUNT),to_char(SCORE)),’,’)) mytable AS obj_view

 select DEPT_NAME ,
       OBJECT_NAME,
       ROUND(SUM(obj_view) / COUNT(*), 2) as SCORE
  from XXXX表 
   LATERAL VIEW explode(split(CONCAT_WS(',',to_char(RCOUNT),to_char(QCOUNT),to_char(SCORE)),',')) mytable AS obj_view
 where 1 = 1
   AND SYS_ID = '1234567890'
 GROUP BY OBJECT_NAME, DEPT_NAME,obj_view
 ORDER BY OBJECT_NAME ;

實現效果為:
在這裡插入圖片描述

最近將解釋欄位新增上的語句

select DEPT_NAME ,
       OBJECT_NAME,
       substr(obj_view,1,INSTR(obj_view,'|')-1) OBJ_COUNT,
       ROUND(SUM(substr(obj_view,INSTR(obj_view,'|')+1)) / COUNT(*), 2) as SCORE
  from XXXX表
   LATERAL VIEW explode(split(CONCAT_WS(',',
   CONCAT_WS('|','屬性總數',to_char(RCOUNT)),
   CONCAT_WS('|','問題屬性總數',to_char(QCOUNT)),
   CONCAT_WS('|','得分',to_char(SCORE))),',')) mytable AS obj_view
 where 1 = 1
   AND SYS_ID = '1234567890'
 GROUP BY OBJECT_NAME, DEPT_NAME,OBJ_COUNT
 ORDER BY DEPT_NAME DESC,OBJECT_NAME;

效果和Oracle實現的列轉行效果一樣
在這裡插入圖片描述