Вы можете сделать это в два этапа. Сначала вы можете увидеть, достигли ли вы требования с помощью функции аналитической суммы:
-- CTE for sample data
with your_table (id, currqty, reqqty) as (
select 1, 30, 100 from dual
union all select 1, 30, 100 from dual
union all select 1, 20, 100 from dual
union all select 2, 100, 100 from dual
)
-- actual query
select id, currqty, reqqty,
sum(currqty) over (partition by id) as totalqty
from your_table;
ID CURRQTY REQQTY TOTALQTY
-- ---------- ---------- ----------
1 30 100 80
1 30 100 80
1 20 100 80
2 100 100 100
, а затем используйте его в качестве CTE, добавив вторую аналитическую функцию, чтобы выбрать любую строку для каждого идентификатора, чтобы использовать ее в качестве основы для дополнительного (при необходимости), и объединяя два запроса вместе:
with your_table (id, currqty, reqqty) as (
select 1, 30, 100 from dual
union all select 1, 30, 100 from dual
union all select 1, 20, 100 from dual
union all select 2, 100, 100 from dual
),
cte (id, currqty, reqqty, totalqty, rn) as (
select id, currqty, reqqty,
sum(currqty) over (partition by id),
row_number() over (partition by id order by null)
from your_table
)
select id, currqty, reqqty
from cte
union all
select id, reqqty - totalqty, reqqty
from cte
where totalqty < reqqty
and rn = 1;
ID CURRQTY REQQTY
-- ---------- ----------
1 30 100
1 30 100
1 20 100
2 100 100
1 20 100
Первая ветвь объединения просто получает ваши исходные данные через CTE. Вторая ветвь ищет только одну строку для любого идентификатора, где сумма не соответствует требованию, и генерирует новую строку для этого идентификатора для разницы.
Если вы не хотите использовать вторую аналитическую функцию, вместо этого вы можете использовать запрос distinct
:
...
select id, currqty, reqqty
from cte
union all
select distinct id, reqqty - totalqty, reqqty
from cte
where totalqty < reqqty;
Кстати, я предположил, что все ваши значения на самом деле являются числами, а не строками; хранение количеств или числовых идентификаторов или любых других числовых значений в виде строки не имеет большого смысла.