Элегантный способ сделать SUM - PullRequest
0 голосов
/ 23 октября 2019

Мне нужен запрос (в Oracle), который будет находиться внутри хранимой процедуры, где я могу получить сумму значения Amount в таблице REV.

ГОД и один МЕСЯЦ будут получены в качестве параметра в хранимой процедуре в виде ГГ и ММ.

Я хочу суммировать значения сумм с 1-го месяца года ВВЕРХк ММ, переданному в аргументе.

Итак,

  • , если ММ в аргументе равно 02, я хочу взять сумму сумм месяцев 01 + 02
  • если в аргументе ММ указано 05, я хочу взять сумму сумм месяцев 01 + 02 + 03 + 04 + 05

Таким образом, ММ - это последний месяц для суммирования.

Как я могу сделать это наиболее эффективным и элегантным способом?

   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

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Я бы предпочел использовать числовые переменные, а не строки для таких случаев.

В вашем случае;

  • , учитывая, что ваши параметры года и месяца относятся к строковому типу, вам необходимо преобразование to_number() с оператором, меньшим или равным to_number(R.MONTH) <= to_number(i_month)

  • добавьте out параметр o_amount, чтобы получить результат, который вы получите

  • Конечно, вам необходимо преобразовать формат SQL, содержащий явные объединения

  • лучше определить параметры (или локальные переменные) по их типу в таблицах, в которых они содержатся. Кстати, я не определяю o_amount по rev.amount%type, поскольку вероятность агрегации sum() может превышать точность числового значения, если оно определено в таблице.

, используйте:

CREATE OR REPLACE PROCEDURE GET_YTD_AMOUNT( 
                                           i_year   in rev.year%type, 
                                           i_month  in rev.month%type, 
                                           o_amount out number
                                           ) IS
BEGIN
  select sum(r.amount) 
    into o_amount
    from activity a
    join rev r
      on r.id_code = a.id_code 
   where r.year = i_year 
     and to_number(r.month) <= to_number(i_month); 
END;
/ 
1 голос
/ 23 октября 2019

Вы можете использовать меньше, чем равно:

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.

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...