如何做累积查询

时间:2018-10-24 08:54:40

标签: sql postgresql

我将在本地尝试共享ddl:

表Inv:

create table inv(
inv_id integer not null primary key,
document_no varchar(150) not null,
grandtotal integer not null);

塔贝尔付款:

create table pay(
pay_id integer not null primary key,
document_no varchar(150) not null,
inv_id integer references inv(inv_id),
payamt integer not null);

插入Inv:

insert into inv(inv_id, document_no, grandtotal) values
(1,'ABC18',50000),(2,'ABC19',45000);

插入付款:

insert into pay(pay_id, document_no, inv_id, payamt) values
(1,'DEF18-1',1,20000),(2,'DEF18-2',1,30000);

如何进行累积查询?我正在尝试

select inv.document_no, inv.grandtotal, sum(pay.payamt), 
sum(pay.payamt)- inv.grandtotal as total
from inv, pay
where inv.inv_id= pay.inv_id
group by inv.document_no, inv.grandtotal

但是它没有给我预期的结果。

1 个答案:

答案 0 :(得分:2)

首先,不要使用Join语法,我建议您不要使用它。你可以看到这里的原因 Bad Habits to kick : using old style joins

从您共享的ddlquery中我假设您想查看交易记录并进行累计?

此查询应该有效:

SELECT inv.document_no                AS doc_inv, 
       inv.grandtotal                 AS total_inv, 
       COALESCE(pay.document_no, '-') AS doc_pay, 
       COALESCE(pay.payamt, '0')      AS total_pay, 
       COALESCE(( inv.grandtotal - Sum(pay.payamt) 
                                     OVER( 
                                       partition BY inv.inv_id 
                                       ORDER BY pay.pay_id) ), inv.grandtotal) 
       AS cumulative 
FROM   inv 
       LEFT OUTER JOIN pay 
                    ON inv.inv_id = pay.inv_id 

我正在使用Left Outer Join,因为您的插入数据中没有Inv得到Pay。当然,只是在没有更多指导的情况下进行猜测。

您需要的是Window Function

定义

  

以某种方式对一组表行执行计算   与当前行有关。

关于join表,您可以在这里阅读:Join Documentation

这里演示:

Demo<>Fiddle