Есть несколько способов достичь желаемого, которое вы описали.
Один из способов - преобразовать требование в функцию, которая принимает два значения входных параметров и возвращает таблицу производственных циклов. Это может выглядеть так:
create or replace function production_rounds(
IN max_production_volume_per_round decimal (10, 2)
, IN production_order_volume decimal (10, 2)
)
returns table (
production_round integer
, production_volume decimal (10, 2))
as
begin
declare rounds_to_produce integer;
declare remainder_production_volume decimal (10, 2);
rounds_to_produce := floor( :production_order_volume / :max_production_volume_per_round);
remainder_production_volume := mod(:production_order_volume, :max_production_volume_per_round);
return
select /* generate rows for all "max" rounds */
s.element_number as production_round
, :max_production_volume_per_round as production_volume
from
series_generate_integer
(1, 1, :rounds_to_produce + 1) s
UNION ALL
select /* generate a row for the final row with the remainder */
:rounds_to_produce + 1 as production_round
, :remainder_production_volume as production_volume
from
dummy
where
:remainder_production_volume > 0.0;
end;
Вы можете использовать эту функцию, как любую таблицу, но с параметрами:
select * from production_rounds (125 , 1027.5) ;
PRODUCTION_ROUND PRODUCTION_VOLUME
1 125
2 125
3 125
4 125
5 125
6 125
7 125
8 125
9 27.5
Бит, который, вероятно, требует объяснения, - это SERIES_GENERATE_INTEGER
. Это встроенная функция c, специфичная для HANA, которая возвращает количество записей из «серии». Здесь серия представляет собой последовательность периодов в пределах минимального и максимального пределов и с определенным размером шага между двумя смежными периодами. Подробнее о том, как это работает, можно найти в справочной документации HANA, но пока просто скажу, что это самый быстрый способ сгенерировать набор результатов с X строками.
Этот генератор серий используется для создания всего " полные «производственные туры». Для второй части UNION ALL
затем создается только одна строка, выбирая из встроенной таблицы DUMMY
(DUAL
в Oracle), которая гарантированно будет иметь только одну запись. Наконец, эту вторую часть необходимо «отключить», если на самом деле нет остатка, что делается с помощью предложения WHERE
.