Как сделать кумулятивный запрос - PullRequest
0 голосов
/ 24 октября 2018

Я хотел бы поделиться ddl, который я пробую в моем регионе:

Инв. Таблицы:

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);

Вставить в инв .:

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

Вставить в Pay:

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 голосов
/ 24 октября 2018

Прежде всего, не используйте этот синтаксис Join, я советую вам не использовать его.Вы можете увидеть причину, по которой здесь Плохие привычки для удара: использование соединений в старом стиле

Из вашего 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 в ваших данных вставки.И, конечно, это только догадки без дополнительных указаний.

И что вам нужно, это Функция окна

Определение :

Выполняет вычисление для набора строк таблицы, которые каким-то образом связаны с текущей строкой.

И о join таблице вы можете прочитать здесь: Присоединиться к документации

Здесь Демо:

Демо <> Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...