繁体   English   中英

存储过程以创建累积总和

[英]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_idfirm_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM