Suppose I have 2 tables T1
and T2
as follows
T1
:
bag_id bag_type capacity
------|--------|--------
1 A
assuming allocation in the descendent order of bag capacity
with agg as (
select bag.BAG_ID, bag.BAG_TYPE, bag.CAPACITY,
SUM(bag.CAPACITY) over (partition by bag.bag_type order by bag.capacity DESC) agg_capacity,
item_amount
from bag, item
where bag.bag_type = item.item_type
)
select
BAG_ID, BAG_TYPE, CAPACITY,
case when ITEM_AMOUNT >= AGG_CAPACITY then CAPACITY /* Full allocated */
when ITEM_AMOUNT >= AGG_CAPACITY-CAPACITY then ITEM_AMOUNT - (AGG_CAPACITY-CAPACITY) /* partly allocated */
else 0 end /* not allocated */
as allocated
from agg
order by bag_type, capacity desc;
BAG_ID BAG_TYPE CAPACITY ALLOCATED
------ -------- ---------- ----------
1 A 500 500
2 A 300 300
3 A 100 50
4 B 200 200
5 B 100 100
Note that the order of the allocation is important if you want to minimize the waste capacity and finding an optimal allocation using different orders could be hard.