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

Reply via email to