存储过程以创建累积总和

时间:2014-03-27 15:16:14

标签: sql stored-procedures firebird2.5

我正在尝试编写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_idfirm_id分组的所有前几个月的总和。 但如果我想获得所有月份的总和,那么我必须运行这12次,将 1 替换为 2 ,然后替换为 3 ,然后 ........ 最后,我得到的累积金额分为几个月,几年,用户和公司。

1 个答案:

答案 0 :(得分:2)

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

请注意,这仅适用于同一年,如果您需要多年累计,则需要修改连接条件。