首页 > Linux操作系统 > Linux操作系统 > PL/SQL开发报表展现格式转换
在吉林电信出差快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/ ,如需转载,请注明出处,否则将追究法律责任。