前段时间在使用Oracle开发数据统计的时候,遇到一个动态行转列、列转行的问题,最终实现如下的效果:
当初设计表的时候,指标、数据及公司在一张表里,现在要求列是动态维护的,也就是说需要多表关联,实现动态行转列,想了半天最后选择用Oracle存储过程加游标来做,下面把这个存储过程分享给大家,有不足的地方大家可以继续补充:
表1:数据存放表(bp_j_stat_ytz)
表2:指标维护表(BP_J_POWER_GENERATION_ITEM)
表3:基础资料表(bp_c_stat_item)
存储过程代码:
procedure pro_tj_dj_date(d_date date,ds out ds_cur) as v_sql varchar2(10000); v_sql_t varchar2(5000); begin v_sql_t := ''; for c in( select * from BP_J_POWER_GENERATION_ITEM i where i.is_use='Y' order by i.standard_code ) loop v_sql_t := v_sql_t || 'sum(case i.standard_item_code when ''' || c.standard_code || ''' then y.data_value end) as ' || c.item_name || ','; end loop; v_sql := ' select ' || v_sql_t || ' i.org_code from BP_J_POWER_GENERATION_ITEM t left join bp_c_stat_item i on t.standard_code=i.standard_item_code left join bp_j_stat_ytz y on i.item_code = y.item_code and y.data_date=''' || d_date || ''' group by i.org_code'; open ds for v_sql; end pro_tj_dj_date;
参数解释:
d_date:日期,表示要查询某个日期下的数据
ds:返回参数,将最终的记录集返回