我需要一个查询(在Oracle中),该查询将在存储过程中,在这里我可以获得表REV的Amount值的总和。
YEAR和一个MONTH将作为存储过程中的一个参数接收,分别为YY和MM。我想要的是对自该参数传递给MM以来的第一年以来的金额值求和。
因此,如果参数中的MM为02,我想将月份的总金额设为01 + 02。如果参数中的MM为05,则我想将月份的总和设为01 + 02 + 03 + 04 + 05。
所以MM是要累加的最后一个月。
我如何以最有效,最优雅的方式做到这一点?
CREATE OR REPLACE PROCEDURE "GET_YTD_AMOUNT" (YY in VARCHAR,
MM in VARCHAR)
select
ACT.LABEL ,
R.YEAR,
R.MONTH,
sum(R.AMOUNT)
from
ACTIVITY ACT,
REV R
where
R.YEAR=YEAR and
R.MONTH ??
R.ID_CODE = ACT.ID_CODE
您可以使用小于等于:
select
ACT.LABEL ,
R.YEAR,
Max(R.MONTH) || '-' || Max(R.MONTH) as months_from_to
sum(R.AMOUNT)
from
ACTIVITY ACT,
REV R
where
R.YEAR= YY and -- it should be YY
R.MONTH <= MM -- less than equal to with MM
R.ID_CODE = ACT.ID_CODE
Group by ACT.LABEL ,
R.YEAR
注意:您必须重新设计数据库以将日期存储为date
数据类型。
干杯!
在这种情况下,我更喜欢使用数字变量而不是字符串。在您的情况下,您需要小于或等于运算符to_number(R.MONTH) <= to_number(i_month)
的to_number转换,并添加out参数o_amount
以返回得到的结果:
CREATE OR REPLACE PROCEDURE GET_YTD_AMOUNT(
i_year in VARCHAR2,
i_month in VARCHAR2,
o_amount out NUMBER
) IS
BEGIN
select sum(R.AMOUNT)
into o_amount
from ACTIVITY ACT
join REV R
on R.ID_CODE = ACT.ID_CODE
where R.YEAR = i_year
and to_number(R.MONTH) <= to_number(i_month);
END;
/