制作SUm的经典方法

问题描述 投票:0回答:2

我需要一个查询(在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
oracle plsql plsqldeveloper
2个回答
0
投票

您可以使用小于等于:

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数据类型。

干杯!


0
投票

在这种情况下,我更喜欢使用数字变量而不是字符串。在您的情况下,您需要小于或等于运算符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;
/ 
© www.soinside.com 2019 - 2024. All rights reserved.