SQL工作应用 - 实现excel行列标题转置功能
实际工作中遇到过,要求将图①表格中的行标题(字段名)与列标题(日期)转置成图②样式 并将字段名替换成中文,以方便使用者研究
使用 hive 实现以上功能,需要依赖中间表,具体可分成两步 ——
第一步:使用 lateral view + explode 函数,将图①原始表中的字段名 行 标题转成 列 标题,并将字段名替换成中 文,生成中间表;
第二步:通过case when 将中间表中的日期列标题转成行标题,得到图②所需结果表
以上步骤具体代码如下 ——
第一步:
drop table if exists tmp.tmp_shop_business_index_qc2_xy;
create table tmp.tmp_shop_business_index_qc2_xy as
select order_date,bool,val
from(select order_date,
map('销售金额',sum_realamt,'订单数',sum_order,'连带率',qty_divide_order,'客单价',customer_unitprice,'复购率',repurchase_rate,'新增客数',sum_newguest,'新客首单客单价',newguest_price,'销售商品件数',sum_qty,'销售sku数',sum_code,'午高峰订单数',noon_indexs) as tmp_column
from tmp.tmp_shop_business_index_qc1_xy) x lateral view explode(tmp_column) exptbl as bool,val;
第二步:
drop table if exists tmp.tmp_shop_business_index_qc3_xy;
create table tmp.tmp_shop_business_index_qc3_xy as
select bool
,sum(case when order_date = date_sub('2021-12-28',6) then val else 0 end) as front_1days
,sum(case when order_date = date_sub('2021-12-28',5) then val else 0 end) as front_2days
,sum(case when order_date = date_sub('2021-12-28',4) then val else 0 end) as front_3days