On Sat, Nov 30, 2002 at 02:40:08PM -0800, Benjamin Smith wrote:
> Let's say you have a table of Financial transactions:
>
> Create table checks (
> id serial,
> number varchar,
> to varchar,
> amount real,
> date integer
> );
>
> (date is an epoch timestamp)
>
> And you want to get a listing of checks
>
> "SELECT * FROM checks ORDER BY date ASC";
>
> but you also want to have an accumulative field that adds up the amount field as the
>results are returned, so you might see results like:
>
> id number to amount date balance
> 1 0 Deposit -100 12344 100
> 2 100 Jack 40 123455 60
> 3 101 Bob 20 123345 40
> 4 102 VOID 0 0 40
> 5 103 Harold 11 123488 29
>
> Is this possible using only SQL?
>
> Also, assuming you have checks year round, how might you get results only in March
>that have totals consistent for the time frame while taking into account all the
>other checks in Jan and Feb?
create table checks (
id serial primary key,
num varchar unique,
"to" varchar,
amt real,
date date
);
insert into checks (num, "to", amt, date) values
(0,'deposit',100,'2002-01-01');
insert into checks (num, "to", amt, date) values
(0,'jack',40,'2002-02-01');
insert into checks (num, "to", amt, date) values
(101,'jack',40,'2002-02-01');
insert into checks (num, "to", amt, date) values
(102,'bob',20,'2002-02-01');
insert into checks (num, "to", amt, date) values
(103,'VOID',0,'2002-02-01');
insert into checks (num, "to", amt, date) values
(104,'jenny',10,'2002-03-01');
insert into checks (num, "to", amt, date) values
(104,'raul',10,'2002-03-02');
insert into checks (num, "to", amt, date) values
(105,'raul',10,'2002-03-02');
select *,
( select sum(amt)
from checks c2
where c2.id<=c1.id as c2)
from checks c1;
will give you the full accounting. To get just March, put a
where-date-between clause in both the outer and inner queries.
This will run slowly, though, for many transactions. Either consider:
* "closing" an account every month/quarter/year/whenever will the
aggregate-so-far, and having your query use that, and do the math from
that point onwards
* store the running balance in the table, and use triggers to keep it up
to date for inserts/updates/deletes
--
Joel BURTON | [EMAIL PROTECTED] | joelburton.com | aim: wjoelburton
Independent Knowledge Management Consultant
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly