[英]Stored Procedure to create cumulative sums
我正在尝试编写Firebird存储过程,它返回由另外两个字段分组的十二个月的累积总和。 现在我创建了这样的东西:
SET TERM ^ ;
CREATE PROCEDURE A_OBRATZISKKUM(
START_YEAR INTEGER,
END_YEAR INTEGER)
RETURNS(
OBRAT DOUBLE PRECISION,
MESIC INTEGER,
ROK INTEGER,
SECURITYUSER_ID TYPE OF ID COLLATE WIN1250,
FIRM_ID TYPE OF ID COLLATE WIN1250)
AS
DECLARE VARIABLE act_month INTEGER = 1;
begin
for select
sum(AO.Obrat), :act_MONTH, :start_YEAR, AO.SecurityUser_ID,
AO.Firm_ID
from A_OBRATYKUMHIST_TEMP AO
where
AO.Rok = :start_year
and AO.Mesic <= :act_month
group by
AO.SecurityUser_ID, AO.Firm_ID
into :obrat, :mesic, :rok, :securityuser_id, :firm_id
do
act_month = :act_MONTH + 1;
suspend;
end^
SET TERM ; ^
但是当我运行它时,我只得到一行有奇怪的总和。 我的代码出了什么问题?
EDIT1。 我从这个SQL查询出来:
select
sum(AO.Obrat), *1*, 2012, AO.SecurityUser_ID,
AO.Firm_ID
from A_OBRATYKUMHIST_TEMP AO
where
AO.Rok = 2012
and AO.Mesic <= *1*
group by
AO.SecurityUser_ID, AO.Firm_ID
当我以3号月份为例时,我获得了所有前几个月的总和,按securityuser_id
firm_id
和firm_id
分组。 但是,如果我想要获得所有月份的总和,那么我必须运行这十二次,将1替换为2 ,然后替换为3 ,然后........最后我得到累积总和分裂达数月,年,用户和公司。
DO
之后是单个语句或块。 您目前正在执行单个SUSPEND
而不是多个暂停。 代替
FOR SELECT ...
DO
statement;
SUSPEND;
你需要这样做
FOR SELECT ...
DO
BEGIN
statement;
SUSPEND;
END
语句act_month = :act_MONTH + 1;
应该是act_month = act_MONTH + 1;
(无结肠:
)
运行总和可以通过所有月份<=
当前月份的自我加入来实现,并总结:
SELECT SUM(AO2.Obrat), AO.Mesic, AO.Rok, AO.SecurityUser_ID, AO.Firm_ID
FROM A_OBRATYKUMHIST_TEMP AO
INNER JOIN A_OBRATYKUMHIST_TEMP AO2
ON AO2.Rok = AO.Rok AND AO2.Mesic <= AO.Mesic
WHERE AO.Rok = 2012
GROUP BY AO.Mesic, AO.Rok, AO.SecurityUser_ID, AO.Firm_ID
请注意,这仅适用于同一年,如果需要多年总和,则需要修改连接条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.