GreenPlum之按月份或季度实现行转列

Posted BingCorePower

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

  

  

以上是关于GreenPlum之按月份或季度实现行转列的主要内容,如果未能解决你的问题,请参考以下文章

通过sql实现动态行转列

行转列

oracle 结果集行转列,多行数据转为一行显示,第一列内容拼接生成字段名

SQLSERVER有张表,需要每晚自动实现行转列。

ORAClE sql如何实现行转列?

SQL sql语句实现行转列的3种方法