Accumulate sum until reaching and *exact* required value ? [message #215710] |
Tue, 23 January 2007 11:04 |
solmyr72
Messages: 3 Registered: January 2007
|
Junior Member |
|
|
Hi,
Could anyone please tell if oracle SQL supports the following requirement ?
it's easy to do in PL/SQL, but I was aiming for pure SQL...
The requirement is basically:
"Accumulate sum until reaching an *exact* required sum (taking part of the last row, if required)".
Example: suppose we have a table of DONERS, for each doner there's the maximun sum he/she is willing to donate.
DONER table:
------------------------------------------------------------
DONER_ID .... MAX_DONATION
------------------------------------------------------------
1 ................... 1000
2 ................... 500
3 ................... 700
Also, we have a single-row table holding the required sum of donations we wish to collect:
REQUIRED_DONATION table [single row]
------------------------------------------------------------
1400
------------------------------------------------------------
Given those, i'd like to generate a view , listing how much to charge from each doner (assuming we prefer to first charge users with small IDs):
CHARES_VIEW [how do you generate this ?]
------------------------------------------------------------
DONER_ID .... CHARGE
------------------------------------------------------------
1 ................... 1000
2 ................... 400 [stop here, having reached the required 1400]
Thanks very much in advance.
|
|
|
Re: Accumulate sum until reaching and *exact* required value ? [message #215717 is a reply to message #215710] |
Tue, 23 January 2007 11:26 |
Cthulhu
Messages: 381 Registered: September 2006 Location: UK
|
Senior Member |
|
|
You should be able to do it by using the sum over (partition).
You would need some sort of date column with which to order the donations. Something like the following should give you the basis of what you need:
create table donor (donor_Id number, amount number, date_donated date);
insert into donor values (1, 700, trunc(sysdate));
insert into donor values (1, 500, trunc(sysdate)-1);
insert into donor values (1, 600, trunc(sysdate)-2);
insert into donor values (1, 400, trunc(sysdate)-3);
create table req_donation (donor_id number, req_amount number);
insert into req_donation values (1, 1400);
select donor_id, req_amount, max_donation
from
(select d.donor_id, r.req_amount, sum(d.amount) over
(partition by d.donor_id order by d.date_donated) as max_donation
from donor D, req_donation r
where d.donor_id = r.donor_id)
where max_donation < req_amount;
|
|
|
|