Thread: Incremental sum ?

Incremental sum ?

From
domingo@dad-it.com (Domingo Alvarez Duarte)
Date:
I have a problem that requires what I call a incremental sum, lets say
I have the folowing table (for simplicity):

table invoices_not_paid(cust_id int, invoice_id int, val numeric, paid
numeric);

with the folowing values:

cust_id   invoice_id   val    paid
----------------------------------
1             23      10.50   3.40
1             34       5.70   0.0
1             67      23.89   4.50


I want show a list like this:

cust_id   invoice_id   val    paid  incremental_not_paid_sum
-----------------------------------------------------------------
1             23      10.50   3.40     (10.50 - 3.40)        7.10
1             34       5.70   0.0    (7.10 + 5.70 - 0.0)    12.80
1             67      23.89   4.50  (12.80 + 23.89 - 4.50)  31.19

The operations betwen () are showed only to explain how the
incremental_not_paid_sum is calculated, The operation requires a
reference to a previous column or a partial sum of columns till that
moment, someone has an idea how this can be done using sql ?


Re: Incremental sum ?

From
Alex Pilosov
Date:
It should be done using subqueries.
select ..., (  select sum(val)-sum(paid) from invoices i2  where i2.invoice_id<i.invoice_id    and i2.cust_id=i.cust_id
)
 
from invoices i


On 22 Jun 2001, Domingo Alvarez Duarte wrote:

> I have a problem that requires what I call a incremental sum, lets say
> I have the folowing table (for simplicity):
> 
> table invoices_not_paid(cust_id int, invoice_id int, val numeric, paid
> numeric);
> 
> with the folowing values:
> 
> cust_id   invoice_id   val    paid
> ----------------------------------
> 1             23      10.50   3.40
> 1             34       5.70   0.0
> 1             67      23.89   4.50
> 
> 
> I want show a list like this:
> 
> cust_id   invoice_id   val    paid  incremental_not_paid_sum
> -----------------------------------------------------------------
> 1             23      10.50   3.40     (10.50 - 3.40)        7.10
> 1             34       5.70   0.0    (7.10 + 5.70 - 0.0)    12.80
> 1             67      23.89   4.50  (12.80 + 23.89 - 4.50)  31.19
> 
> The operations betwen () are showed only to explain how the
> incremental_not_paid_sum is calculated, The operation requires a
> reference to a previous column or a partial sum of columns till that
> moment, someone has an idea how this can be done using sql ?
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
> 
> 



Re: Incremental sum ?

From
"Ross J. Reedstrom"
Date:
And here's the working example: not the need to GROUP BY, and <=
to get the current payment.

select cust_id,invoice_id,val,paid, (select (sum(val) - sum(paid))
from invoices_not_paid where cust_id= i.cust_id and invoice_id <=
i.invoice_id group by cust_id) as balance  from invoices_not_paid i;

and it's output:
cust_id | invoice_id |    val    |   paid   |  balance  
---------+------------+-----------+----------+-----------      1 |         23 | 10.500000 | 3.400000 |  7.100000      1
|        34 |  5.700000 | 0.000000 | 12.800000      1 |         67 | 23.890000 | 4.500000 | 32.190000
 
(3 rows)

Ross

On Fri, Jun 22, 2001 at 11:29:25AM -0400, Alex Pilosov wrote:
> It should be done using subqueries.
> select ..., (
>    select sum(val)-sum(paid) from invoices i2
>    where i2.invoice_id<i.invoice_id
>      and i2.cust_id=i.cust_id
>    )
> from invoices i
> 
> 
> On 22 Jun 2001, Domingo Alvarez Duarte wrote:
> 
> > I have a problem that requires what I call a incremental sum, lets say
> > I have the folowing table (for simplicity):
> > 
> > table invoices_not_paid(cust_id int, invoice_id int, val numeric, paid
> > numeric);
> > 
> > with the folowing values:
> > 
> > cust_id   invoice_id   val    paid
> > ----------------------------------
> > 1             23      10.50   3.40
> > 1             34       5.70   0.0
> > 1             67      23.89   4.50
> > 
> > 
> > I want show a list like this:
> > 
> > cust_id   invoice_id   val    paid  incremental_not_paid_sum
> > -----------------------------------------------------------------
> > 1             23      10.50   3.40     (10.50 - 3.40)        7.10
> > 1             34       5.70   0.0    (7.10 + 5.70 - 0.0)    12.80
> > 1             67      23.89   4.50  (12.80 + 23.89 - 4.50)  31.19
> > 
> > The operations betwen () are showed only to explain how the
> > incremental_not_paid_sum is calculated, The operation requires a
> > reference to a previous column or a partial sum of columns till that
> > moment, someone has an idea how this can be done using sql ?
> > 
> > ---------------------------(end of broadcast)---------------------------
> > TIP 4: Don't 'kill -9' the postmaster
> > 
> > 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
> 
> http://www.postgresql.org/search.mpl


Re: Incremental sum ?

From
Tom Lane
Date:
"Ross J. Reedstrom" <reedstrm@rice.edu> writes:
> And here's the working example: not the need to GROUP BY, and <=
> to get the current payment.

> select cust_id,invoice_id,val,paid, (select (sum(val) - sum(paid))
> from invoices_not_paid where cust_id= i.cust_id and invoice_id <=
> i.invoice_id group by cust_id) as balance  from invoices_not_paid i;

Actually I think you could leave off the inner GROUP BY --- won't there
always be exactly one group, since only one value of inner cust_id is
selected?
        regards, tom lane


Re: Incremental sum ?

From
"Ross J. Reedstrom"
Date:


On Fri, Jun 22, 2001 at 12:58:46PM -0400, Tom Lane wrote:
> "Ross J. Reedstrom" <reedstrm@rice.edu> writes:
> > And here's the working example: not the need to GROUP BY, and <=
> > to get the current payment.
> 
> > select cust_id,invoice_id,val,paid, (select (sum(val) - sum(paid))
> > from invoices_not_paid where cust_id= i.cust_id and invoice_id <=
> > i.invoice_id group by cust_id) as balance  from invoices_not_paid i;
> 
> Actually I think you could leave off the inner GROUP BY --- won't there
> always be exactly one group, since only one value of inner cust_id is
> selected?

Sure enough, it works fine. My internal rule: "can't use aggregates
without a group by" mis-fired.

Ross