Возможно, об этом уже спрашивали несколько раз, но я не знаю, как добиться правильного сома как от родителя, так и от ребенка.
Вот таблицы:
CREATE TABLE co
(coid int4, coname text);
INSERT INTO co
(coid, coname)
VALUES
(1, 'Volvo'),
(2, 'Ford'),
(3, 'Jeep'),
(4, 'Toyota')
;
CREATE TABLE inv
(invid int4, invco int4, invsum numeric(10,2));
INSERT INTO inv
(invid, invco, invsum)
VALUES
(1,1,100),
(2,1,100),
(3,2,100),
(4,3,100),
(5,4,100)
;
CREATE TABLE po
(poid int4, poinv int4, posum int4);
INSERT INTO po
(poid, poinv, posum)
VALUES
(1,1,50),
(2,1,50),
(3,3,100),
(4,4,100)
;
Я начал с этого простого запроса
SELECT coname, sum(invsum)
FROM inv
LEFT JOIN co ON coid=invco
GROUP BY 1
ORDER BY 1
Что дало правильный результат:
coname sum
Ford 100
Jeep 100
Toyota 100
Volvo 200
Затем я добавил запись po, и суммы стали неверными:
SELECT coname, sum(posum) as po, sum(invsum)
FROM inv
LEFT JOIN co ON coid=invco
LEFT JOIN po ON poinv=invid
GROUP BY 1
ORDER BY 1
Что умножило сумму для Volvo:
coname po sum
Ford 100 100
Jeep 100 100
Toyota (null) 100 (no records for po = correct)
Volvo 100 300 (wrong sum for inv)
Как мне построить запрос, который дает правильный результат с несколькими подзаписями po? (Оконная функция?)
SQLfiddle: http://sqlfiddle.com/#!15/0d90c/12
co
кажется просто словарной таблицей дляinv.invco
, поэтому не следует ли вам начать сinv
? 18.09.2016