我将在本地尝试共享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
但是它没有给我预期的结果。
答案 0 :(得分:2)
首先,不要使用Join
语法,我建议您不要使用它。你可以看到这里的原因
Bad Habits to kick : using old style joins
从您共享的ddl
和query
中我假设您想查看交易记录并进行累计?
此查询应该有效:
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
这里演示: