select 订单号,sum(decode(账目类型,1,费用,0)) as 账目类型1,sum(decode(账目类型,2,费用,0)) as 账目类型2,sum(decode(账目类型,3,费用,0)) as 账目类型3,sum(decode(账目类型,4,费用,0)) as 账目类型4 from tablename group by 订单号; 要做到账目类型动态增加,一个sql语句可能是实现不了的,需要用存储过程了
declare cursor cu00 select 帐目类型 from 表名 group by 帐目类型; declare cursor cu0 select 定单号 from 表名 group by 定单号; declare cursor cu1 select 定单号,帐目类型,sum(费用) from 表名 where 定单号 = :group by 定单号,帐目类型 for cu3 in cu00 loop --用动态sql创建临时表 end for; for cu in cu0 loop for cu2 in cu1(cu0.定单号) loop --用动态语句插入临时表 end loop; end loop; 给个思路不知行不行 :-)
create procedure get as str varchar2(100); cursor t1_sor is select 定单号 from table_name group by 定单号; cursor t2_sor(v_定单号 varchar2) is select 帐目类型,sum(费用) 费用 from table_name where 定单号=v_定单号 group by 帐目类型; begin --dbms_output.put('定单号'); for v1_sor in t1_sor loop dbms_output.put(v1_sor.定单号); for v2_sor in t2_sor(v1_sor.定单号) loop dbms_output.put(v1_sor.v2_sor.费用||' '); end loop; dmbs_output.put_line(' '); end loop; end; /
要做到账目类型动态增加,一个sql语句可能是实现不了的,需要用存储过程了
select 帐目类型 from 表名 group by 帐目类型;
declare cursor cu0
select 定单号 from 表名 group by 定单号;
declare cursor cu1
select 定单号,帐目类型,sum(费用) from 表名 where 定单号 = :group by 定单号,帐目类型
for cu3 in cu00 loop
--用动态sql创建临时表
end for;
for cu in cu0 loop
for cu2 in cu1(cu0.定单号) loop
--用动态语句插入临时表
end loop;
end loop;
给个思路不知行不行 :-)
as
str varchar2(100);
cursor t1_sor is
select 定单号 from table_name group by 定单号;
cursor t2_sor(v_定单号 varchar2) is
select 帐目类型,sum(费用) 费用 from table_name where 定单号=v_定单号 group by 帐目类型;
begin
--dbms_output.put('定单号');
for v1_sor in t1_sor loop
dbms_output.put(v1_sor.定单号);
for v2_sor in t2_sor(v1_sor.定单号) loop
dbms_output.put(v1_sor.v2_sor.费用||' ');
end loop;
dmbs_output.put_line(' ');
end loop;
end;
/
你的东西看不蛮明白,能说清楚点吗?
解释下每个语句
所以用的存储过程create procedure...。
游标t1_sor是取定单号,
游标t2_sor是根据每个定单号取每帐目的费用。
然后把取出的数据在sql*plus中打印出(dbms_output.put)。