使用oracle窗体和sql developer。试图将表中的金额转移到excel。在这样做的时候,我需要把一个月分成四个星期。我试着每周检查一次如果elsif循环。若要查找每周金额,请将指定日期范围内的金额汇总。代码能够进入循环并读取记录,但不能读取数量。我哪里做错了?
DECLARE
CURSOR c IS
SELECT varis_tar, tutar
FROM muhasebe.doviz_takip
WHERE TRUNC(varis_tar) BETWEEN TO_DATE('01/10/2021', 'DD/MM/YYYY')
AND TO_DATE('31/10/2021', 'DD/MM/YYYY')
GROUP BY varis_tar,tutar;
tutar1 NUMBER(9):=0;
tutar2 NUMBER(9):=0;
tutar3 NUMBER(9):=0;
tutar4 NUMBER(9):=0;
BEGIN
FOR r IN c LOOP
IF r.varis_tar BETWEEN TO_DATE('01/10/2021', 'DD/MM/YYYY') AND
TO_DATE('07/10/2021', 'DD/MM/YYYY') THEN
tutar1:=tutar1+r.tutar;
message('tutar1',tutar1);
ELSIF r.varis_tar BETWEEN TO_DATE('07/10/2021', 'DD/MM/YYYY') AND
TO_DATE('14/10/2021', 'DD/MM/YYYY') then
tutar2:=tutar2+r.tutar;
message('tutar2',tutar2);
ELSIF r.varis_tar BETWEEN TO_DATE('14/10/2021', 'DD/MM/YYYY') AND
TO_DATE('21/10/2021', 'DD/MM/YYYY') then
tutar3:=tutar3+r.tutar;
message('tutar3',tutar3);
ELSIF r.varis_tar BETWEEN TO_DATE('21/10/2021', 'DD/MM/YYYY') AND
TO_DATE('31/10/2021', 'DD/MM/YYYY') THEN
tutar4:=tutar4+r.tutar;
message('tutar4',tutar4);
END IF;
END LOOP;
发布于 2021-12-28 10:26:27
您的代码将聚合行,以便将具有相同varis_tar
和tutar
的行合并到一个聚合行中。然后,它将逐行循环并执行聚合,为每个累积步骤调用message
函数。
这是效率低下的,您可以使用条件聚合直接在SQL语句中SUM
值,然后用最后的值调用message
:
declare
tutar1 muhasebe.doviz_takip.tutar%TYPE;
tutar2 muhasebe.doviz_takip.tutar%TYPE;
tutar3 muhasebe.doviz_takip.tutar%TYPE;
tutar4 muhasebe.doviz_takip.tutar%TYPE;
begin
select SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN 1 AND 7 THEN tutar END),
SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN 8 AND 14 THEN tutar END),
SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN 15 AND 21 THEN tutar END),
SUM(CASE WHEN EXTRACT(DAY FROM varis_tar) BETWEEN 22 AND 31 THEN tutar END)
into tutar1,
tutar2,
tutar3,
tutar4
from muhasebe.doviz_takip
where varis_tar >= DATE '2021-10-01'
and varis_tar < DATE '2021-11-01';
message('tutar1',tutar1);
message('tutar2',tutar2);
message('tutar3',tutar3);
message('tutar4',tutar4);
end;
/
https://stackoverflow.com/questions/70504582
复制相似问题