Możesz to zrobić w SQL Server 2008 w następujący sposób:
declare @Buckets table (ID char(2), FullCapacity int)
declare @Filler table (ID char(2), Filler int)
insert into @Buckets
select 'B1', 100 union all
select 'B2', 50 union all
select 'B3', 70
insert into @Filler
select 'F1', 90 union all
select 'F2', 70 union all
select 'F3', 40 union all
select 'F4', 20
select
b.ID,
b.FullCapacity,
case
when f.TotalFill < b.RunningTotalCapacity then 0
when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity
else f.TotalFill - b.RunningTotalCapacity
end as CurrentAmount
from
(
select
ID,
Filler,
(
select sum(f2.Filler)
from @Filler as f2
where f2.ID <= f.ID
) as TotalFill
from @Filler as f
) as f
cross join
(
select
ID,
FullCapacity,
(
select isnull(sum(b2.FullCapacity), 0)
from @Buckets as b2
where b2.ID < b.ID
) as RunningTotalCapacity
from @Buckets as b
) as b
order by f.ID, b.ID
Możesz to zrobić za pomocą funkcji okienkowych, takich jak:
Serwer SQL 2012+
declare @Buckets table (ID char(2), FullCapacity int)
declare @Filler table (ID char(2), Filler int)
insert into @Buckets values
('B1', 100),
('B2', 50),
('B3', 70)
insert into @Filler values
('F1', 90),
('F2', 70),
('F3', 40),
('F4', 20)
;with fillerCte as
(
select
ID,
Filler,
sum(Filler) over (order by ID) as TotalFill
from @Filler
),
BucketCte as
(
select
ID,
FullCapacity,
sum(FullCapacity) over (order by ID) - FullCapacity as RunningTotalCapacity
from @Buckets
)
select
b.ID,
b.FullCapacity,
case
when f.TotalFill < b.RunningTotalCapacity then 0
when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity
else f.TotalFill - b.RunningTotalCapacity
end as CurrentAmount
from fillerCte as f
cross join BucketCte as b
order by f.ID, b.ID