GreenPlum之按月份或季度實現行轉列

1.參考GreenPlum之生成月份字典表

   GreenPlum之生成月份字典表


2.根據Case When語句及GreenPlum中string_agg聚合函數拼湊對應月份或季度週期字段,以下是核心實現sql,讀者可根據需求自行修改:

  
--字段按照月份行轉列
if position('yyyy-mm' in in_datecolum)>0 then 
    
  out_strsql := '
  select 

  '||case in_matrix 
  when 1 then 'string_agg('',cast(count(distinct case when 日期字段=''''''||monthid||'''''' then 表名.字段名1 end) as numeric(16,0)) as "''||monthid||''" '','''' order by monthid)' 
  when 2 then 'string_agg('',sum(case when 日期字段=''''''||monthid||'''''' then 表名.字段名2 else 0 end) as "''||monthid||''" '','''' order by monthid)' 
  when 3 then 'string_agg('',sum(case when 日期字段=''''''||monthid||'''''' then 表名.字段名3 else 0 end) as "''||monthid||''" '','''' order by monthid)' 
  when 4 then 'string_agg('',cast(count(distinct case when 日期字段=''''''||monthid||'''''' then 表名.字段名4 end) as numeric(16,0)) as "''||monthid||''" '','''' order by monthid)' 
  
  else 
  'string_agg('',sum(case when 日期字段=''''''||monthid||'''''' then 表名.字段名3 else 0 end) as "''||monthid||''" '','''' order by monthid)'
  end 
  ||'from (
  select monthid from monthmapping where onday between '''||in_startdate||''' and '''||in_overdate||''' group by monthid) tab
  ';

  execute out_strsql into aggstr;

--字段按照季度實現行轉列
  else 

  out_strsql := '
  select 

  '||case in_matrix 
  when 1 then 'string_agg('',cast(count(distinct case when 日期字段=''''''||monthid||'''''' then 表名.字段名1 end) as numeric(16,0)) as "''||monthid||''" '','''' order by monthid)' 
  when 2 then 'string_agg('',sum(case when 日期字段=''''''||monthid||'''''' then 表名.字段名2 else 0 end) as "''||monthid||''" '','''' order by monthid)' 
  when 3 then 'string_agg('',sum(case when 日期字段=''''''||monthid||'''''' then 表名.字段名3 else 0 end) as "''||monthid||''" '','''' order by monthid)' 
  when 4 then 'string_agg('',cast(count(distinct case when 日期字段=''''''||monthid||'''''' then 表名.字段名4 end) as numeric(16,0)) as "''||monthid||''" '','''' order by monthid)' 
  
  else 
  'string_agg('',sum(case when 日期字段=''''''||monthid||'''''' then 表名.字段名3 else 0 end) as "''||monthid||''" '','''' order by monthid)'
  end 
  ||'from (
  select substring(onday,1,4)||''-''||EXTRACT(QUARTER from onday)||''-01'' as monthid from monthmapping where onday between '''||in_startdate||''' and '''||in_overdate||''' 
  group by substring(onday,1,4)||''-''||EXTRACT(QUARTER from onday)||''-01'') tab
  ';

  execute out_strsql into aggstr;

  end if;

  raise notice 'aggstr : %',aggstr;


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