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實現的列轉行效果一樣
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章