ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL开发报表展现格式转换

PL/SQL开发报表展现格式转换

原创 Linux操作系统 作者:kiddwyl 时间:2019-05-14 21:30:07 0 删除 编辑

在吉林电信出差快2个月了,感觉开始慢慢的适应了当地的气候了,只是想家是必然的不过这是工作呀,哈哈

今天在开发中遇到一个问题,由于需要使用公司的开发框架(不评论构架本身是好是坏),需要将原本的数据按照报表的形式显示出来,原本的显示格式如下:
    序号       局站名称           月份           用电量
       1             局站1          200901           74
       2             局站1          200902           83
       3             局站1          200903           93
       4             局站2          200901           174
       5             局站2          200902           184
       6             局站2          200903           194
       7             局站3          200901           274
       8             局站3          200902           284
       9             局站3          200903           294

需要将这些数据形式显示成:
    序号       月份        局站1   局站2        局站3 
       1         200901     74        174          274
       2         200902     83        184          284
       3         200903     93        194          294

我们可以把他理解成行和列的转换,或者是报表展现吧
首先我考虑使用分析函数或者procedure来进行开发,有Oracle PL/SQL经验的人肯定会这么去想,当然我个人认为也是最方便和效率最高的开发方式,但是由于构架的原因,不可以这么使用。。只能使用JAVA硬编码的形式来解决(这叫什么构架哦。。)

当然使用JAVA硬编码的话,效率可想而知。。好了,撇开这个不说,还是憋不住使用PL/SQL写了一个,发上来记录一下,哈哈

SQL> desc temp_kiddtest;
Name     Type          Nullable Default Comments
-------- ------------- -------- ------- --------
COLUMN0  VARCHAR2(150) Y                        
COLUMN1  VARCHAR2(150) Y                        
COLUMN2  VARCHAR2(150) Y                        
COLUMN3  VARCHAR2(150) Y                        
COLUMN4  VARCHAR2(150) Y                        
COLUMN5  VARCHAR2(150) Y                        
COLUMN6  VARCHAR2(150) Y                        
COLUMN7  VARCHAR2(150) Y                        
COLUMN8  VARCHAR2(150) Y                        
COLUMN9  VARCHAR2(150) Y                        
COLUMN10 VARCHAR2(150) Y                        
COLUMN11 VARCHAR2(150) Y                        
COLUMN12 VARCHAR2(150) Y                        
COLUMN13 VARCHAR2(150) Y                        
COLUMN14 VARCHAR2(150) Y                        
COLUMN15 VARCHAR2(150) Y   

Procedure test:

create or replace procedure test(
    -----------
    --输出参数--
    -----------
    o_status      out integer,
    rt_cursor     out types.cursorType
) is

    v_sqlstr             varchar2(4000);
    v_maxdata            number(10);
begin
    --初始化参数
    o_status     := 0;
   
    --count--
    select count(0) into v_maxdata from ( select distinct(name) from kidd_test);
   
    --生成INSERT临时表SQL语句部分--
    v_sqlstr := 'insert into temp_kiddtest(column0';
    for i in 1..v_maxdata loop
          v_sqlstr := v_sqlstr || ',column'||i;
    end loop;
    v_sqlstr := v_sqlstr || ')';
   
    v_sqlstr := v_sqlstr ||'select title';
   
    FOR r IN (select distinct(name) as name from kidd_test)
    LOOP
           v_sqlstr := v_sqlstr || ',sum(decode(name,' || chr(39) || r.name || chr(39) ||',title_values,0)) ';
    end loop;
   
    v_sqlstr := v_sqlstr || ' from kidd_test group by title';

    begin
        --执行生成的SQL语句
        execute immediate v_sqlstr;
    exception
        when others then
        raise ;
    end;

    --输出游标--
    open rt_cursor for
    select * from temp_kiddtest;

end test;

生成SQL语句:
insert into temp_kiddtest
  (column0, column1, column2, column3)
  select title,
         sum(decode(name, '局站1', title_values, 0)),
         sum(decode(name, '局站2', title_values, 0)),
         sum(decode(name, '局站3', title_values, 0))
    from kidd_test
   group by title

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/111631/viewspace-623233/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2004-08-27

  • 博文量
    66
  • 访问量
    59992