Hive 多列轉行 (if函式)

2021-08-28 20:59:06 字數 3135 閱讀 7096

最近有個專案需要做資料匯出(基於底層寬表),具體業務邏輯在這就不詳細介紹,以下是具體實現方案:

列轉換–方案一 case when 與max 或sum

select *

from (select dzgs_dqbm,

max(bs_wks) bs_wks,

max(bs_jxz) bs_jxz,

max(bs_ywc) bs_ywc,

max(bs_wks_ztdm) wks_ztdm,

max(bs_jxz_ztdm) bs_jxz_ztdm,

max(bs_ywc_ztdm) bs_ywc_ztdm,

bsz_ztdm

from (select a.dzgs_dqbm,

case when a.baoshui_zt =『0』 then 『bs_wks』 end bs_wks,

case when a.baoshui_zt =『1』 then 『bs_jxz』 end bs_jxz,

case when a.baoshui_zt =『2』 then 『bs_ywc』 end bs_ywc,

case when a.baoshui_zt =『0』 then a.baoshui_ztdm end bs_wks_ztdm,

case when a.baoshui_zt =『1』 then a.baoshui_ztdm end bs_jxz_ztdm,

case when a.baoshui_zt =『2』 then a.baoshui_ztdm end bs_ywc_ztdm,

b.bsz_ztdm

from (select dzgs_dqbm,

baoshui_zt,

count(k_ztdm) baoshui_ztdm

from dwb_business_status_list

where dt =『20181008』 and sbcz = 『1』

and ty_kjnd is null

and k_nf=『2018』 and k_yf=『9』

group by dzgs_dqbm,baoshui_zt ) a left join (select dzgs_dqbm,count(k_ztdm) bsz_ztdm from dwb_business_status_list where dt =『20181008』 and sbcz = 『1』 and ty_kjnd is null and k_nf=『2018』 and k_yf=『9』 group by dzgs_dqbm) b

on a.dzgs_dqbm=b.dzgs_dqbm ) q

group by dzgs_dqbm,bsz_ztdm ) c inner join ( select dzgs_dqbm,

max(jz_wks) jz_wks,

max(jz_jxz) jz_jxz,

max(jz_ywc) jz_ywc,

max(jz_wks_ztdm) jz_wks_ztdm,

max(jz_jxz_ztdm) jz_jxz_ztdm,

max(jz_ywc_ztdm) jz_ywc_ztdm,

jzz_ztdm

from (select a.dzgs_dqbm,

case when a.jizhang_zt=『0』 then 『jz_wks』 end jz_wks,

case when a.jizhang_zt=『1』 then 『jz_jxz』 end jz_jxz,

case when a.jizhang_zt=『2』 then 『jz_ywc』 end jz_ywc,

case when a.jizhang_zt=『0』 then a.jizhang_ztdm end jz_wks_ztdm,

case when a.jizhang_zt=『1』 then a.jizhang_ztdm end jz_jxz_ztdm,

case when a.jizhang_zt=『2』 then a.jizhang_ztdm end jz_ywc_ztdm,

b.jzz_ztdm

from (select dzgs_dqbm,

jizhang_zt,

count(k_ztdm) jizhang_ztdm

from dwb_business_status_list

where dt =『20181008』 and sbcz = 『1』 and ty_kjnd is null and k_nf=『2018』 and k_yf=『9』

group by dzgs_dqbm,jizhang_zt ) a inner join ( select dzgs_dqbm, count(k_ztdm) jzz_ztdm from dwb_business_status_list where dt =『20181008』 and sbcz = 『1』 and ty_kjnd is null and k_nf=『2018』 and k_yf=『9』 group by dzgs_dqbm) b

on a.dzgs_dqbm=b.dzgs_dqbm ) m

group by dzgs_dqbm,jzz_ztdm ) d

on c.dzgs_dqbm=d.dzgs_dqbm;

–方案二

–列轉換 用if函式 if(jizhang_zt=『0』,1,0)

select

dzgs_dqbm,

sum(if(jizhang_zt=『0』,1,0)) jizhang_zt_0,

sum(if(jizhang_zt=『1』,1,0)) jizhang_zt_1,

sum(if(jizhang_zt=『2』,1,0)) jizhang_zt_2,

sum(if(baoshui_zt=『0』,1,0)) baoshui_zt_0,

sum(if(baoshui_zt=『1』,1,0)) baoshui_zt_1,

sum(if(baoshui_zt=『2』,1,0)) baoshui_zt_2,

count(1)

from biz_dw.dwb_business_status_list

where dt =『20181008』 and sbcz = 『1』

and ty_kjnd is null

and k_nf=『2018』 and k_yf=『9』

group by dzgs_dqbm

hive列轉行案例

1 函式說明 explode col 將 hive 一列中複雜的 array 或者 map 結構拆分成多行。lateral view 用法 lateral view udtf expression tablealias as columnalias 解釋 用於和 split,explode 等 ud...

hive 列轉行 HQL 行轉列,列轉行

1 相關函式 concat string a col,string b col 返回輸入字串連線後的結果,支援任意個輸入字串 concat ws separator,str1,str2,它是乙個特殊形式的 concat 第乙個引數剩餘引數間的分隔符。分隔符可以是與剩餘引數一樣的字串。如果分隔符是 n...

函式 Hive 行轉列 和 列轉行

在hive實際開發過程中,我們會遇到 行轉列 和 列轉行 的場景。比如 1 需要取 訂單號 對應的所有商品 sku號 商品 sku號 放在一列,即從table1查詢出table2 2 當商品 sku號 均在一列的時候,需要查詢每個 sku號 對應的 訂單號 即從table2查詢出table1。實現方...