17,382
社区成员




SELECT SUM(winamt)||','||count(*) into v_ljamt FROM temp_rebate_anlyse WHERE mobiles = v_mobiles;
SELECT city into v_city FROM temp_rebate_anlyse WHERE rownum =1 AND mobiles = v_mobiles;
SELECT SUM(winamt)||','||count(*) into v_nowamt FROM temp_rebate_anlyse WHERE windate >=date1 AND windate <=date2 AND mobiles = v_mobiles;
SELECT SUM(winamt) into v_ljOilamt FROM temp_rebate_anlyse WHERE mobiles = v_mobiles AND isoil ='0';
SELECT SUM(winamt)||','||count(*) into v_nowOilamt FROM temp_rebate_anlyse WHERE isoil ='0' AND windate >=date1 AND windate <=date2 AND mobiles = v_mobiles;
以上语句可以利用decode或case when合并到一起执行,这样只需遍历一边就可以了
未测试,参考
select SUM(winamt)||','||count(*),max(v_city),
sum(case when windate >=date1 AND windate <=date2 then winamt end)||','
||nvl(sum(case when windate >=date1 AND windate <=date2 then 1 end),0),
sum(decode(isoil,'0',winamt)),
sum(case when isoil ='0' AND windate >=date1 AND windate <=date2 then winamt end)||','
||nvl(sum(case when isoil ='0' AND windate >=date1 AND windate <=date2 then 1 end),0)
into v_ljamt,v_city,v_nowamt,v_ljOilamt,v_nowOilamt
where mobiles = v_mobiles;
create or replace procedure rebate_anlyse(date1 in varchar2,date2 in varchar2, v_cursor out CLOB)
as
v_mobiles varchar2(20);
v_ljamt varchar2(20);
v_nowamt varchar2(20);
v_ljOilamt varchar2(20);
v_city varchar2(20);
v_nowOilamt varchar2(20);
strs varchar2(200);
begin
dbms_lob.createtemporary(v_cursor,true);
/**********先放入临时表**********/
/***************************再业务统计************************************/
insert into temp_rebate_anlyse
SELECT * FROM (
SELECT mobiles ,city ,winamt,windate,isoil FROM t_act_wintxn_group t
where windate>=date1 and windate<=date2
union all
SELECT product_no,create_user,nvl(win_money,0) win_money,win_date,'1' FROM t_act_win_txn_his y
where recharge_result='01' and win_date>=date1 and win_date<=date2
union all
SELECT product_no , create_user, nvl(win_money,0) win_money,win_date,'1' FROM t_act_win_txn t
where recharge_result='01' and win_date>=date1 and win_date<=date2
);
DECLARE
CURSOR myCusor IS select distinct(mobiles) from temp_rebate_anlyse WHERE windate >=date1 AND windate <=date2 ;
begin
OPEN myCusor;
LOOP
fetch myCusor into v_mobiles;
EXIT WHEN myCusor%NOTFOUND;
SELECT SUM(winamt)||','||count(*) into v_ljamt FROM temp_rebate_anlyse WHERE mobiles = v_mobiles;
SELECT city into v_city FROM temp_rebate_anlyse WHERE rownum =1 AND mobiles = v_mobiles;
SELECT SUM(winamt)||','||count(*) into v_nowamt FROM temp_rebate_anlyse WHERE windate >=date1 AND windate <=date2 AND mobiles = v_mobiles;
SELECT SUM(winamt) into v_ljOilamt FROM temp_rebate_anlyse WHERE mobiles = v_mobiles AND isoil ='0';
SELECT SUM(winamt)||','||count(*) into v_nowOilamt FROM temp_rebate_anlyse WHERE isoil ='0' AND windate >=date1 AND windate <=date2 AND mobiles = v_mobiles;
strs:= v_mobiles||':'||v_ljamt||':'||v_nowamt||':'||v_ljOilamt||':'||v_nowOilamt||':'||v_city||';';
--v_cursor:=v_cursor||strs;
DBMS_LOB.Append(v_cursor,strs);--CLOB拼接方式,非竖线
END LOOP;
CLOSE myCusor;
end;
end rebate_anlyse;
================================================================
===============================================================
这个是修改前的sql,10万数据,耗时6分钟。。
create or replace procedure rebate_anlyse(date1 in varchar2,date2 in varchar2, v_cursor out CLOB)
as
v_mobiles varchar2(20);
v_ljamt varchar2(20);
v_nowamt varchar2(20);
v_ljOilamt varchar2(20);
v_city varchar2(20);
v_nowOilamt varchar2(20);
strs varchar2(200);
begin
dbms_lob.createtemporary(v_cursor,true);
/**********先放入临时表**********/
/***************************再业务统计************************************/
insert into temp_rebate_anlyse
SELECT * FROM (
SELECT mobiles ,city ,winamt,windate,isoil FROM t_act_wintxn_group t
where windate>=date1 and windate<=date2
union all
SELECT product_no,create_user,nvl(win_money,0) win_money,win_date,'1' FROM t_act_win_txn_his y
where recharge_result='01' and win_date>=date1 and win_date<=date2
union all
SELECT product_no , create_user, nvl(win_money,0) win_money,win_date,'1' FROM t_act_win_txn t
where recharge_result='01' and win_date>=date1 and win_date<=date2
);
DECLARE CURSOR myCusor IS
SELECT mobiles,
(SELECT SUM(winamt)||','||count(*) FROM temp_rebate_anlyse
WHERE mobiles = t.mobiles ) ljamt,
(SELECT city FROM temp_rebate_anlyse
WHERE mobiles = t.mobiles AND rownum =1) city,
(SELECT SUM(winamt)||','||COUNT(*) FROM temp_rebate_anlyse
WHERE mobiles = t.mobiles AND windate >=date1 AND windate <=date2) nowamt,
(SELECT SUM(winamt) FROM temp_rebate_anlyse
WHERE mobiles = t.mobiles AND isoil ='0') ljOilamt,
(SELECT SUM(winamt)||','||COUNT(*) FROM temp_rebate_anlyse
WHERE mobiles = t.mobiles AND isoil ='0' AND windate >=date1 AND windate <=date2) nowOilamt
FROM (select distinct(mobiles),windate from temp_rebate_anlyse WHERE windate >=date1 AND windate <=date2 ) t
order by city;
begin
OPEN myCusor;
LOOP
fetch myCusor into v_mobiles, v_ljamt,v_nowamt,v_ljOilamt ,v_nowOilamt,v_city;
EXIT WHEN myCusor%NOTFOUND;
strs:= v_mobiles||':'||v_ljamt||':'||v_nowamt||':'||v_ljOilamt||':'||v_nowOilamt||':'||v_city||';';
--v_cursor:=v_cursor||strs;
DBMS_LOB.Append(v_cursor,strs);--CLOB类型不能直接竖线拼接,clob有自己的字符串操作方法
END LOOP;
CLOSE myCusor;
--dbms_output.put_line(v_cursor);
end;
end rebate_anlyse;