我正在尝试编写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
分组的所有前几个月的总和。
但如果我想获得所有月份的总和,那么我必须运行这12次,将 1 替换为 2 ,然后替换为 3 ,然后 ........
最后,我得到的累积金额分为几个月,几年,用户和公司。
答案 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
请注意,这仅适用于同一年,如果您需要多年累计,则需要修改连接条件。