多个子记录的正确总和(postgresql)

时间:2016-09-18 14:01:09

标签: postgresql sum

之前可能已经多次询问过,但我不知道如何从父母和孩子那里获得正确的som。

以下是表格:

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

乘以沃尔沃的总和:

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

1 个答案:

答案 0 :(得分:1)

在连接之前进行聚合。在您的情况下,这有点复杂,因为coLEFT JOIN之间的关系似乎需要graph_dict = {'b': ['a', 'c'], 'a': [], 'c': ['a'], 'd': []}

    edges = graph_dict[vertex]
    writer.writerow({'vertices': vertex, 'edges': edges})

注意:我假设逻辑是将所有内容保留在writer.writerow({'vertices': vertex, 'edges': ','.join(edges)}) 表中,即使其他表中没有匹配项也是如此。 {{1}}应该以此表开头,该表包含您要保留的所有行。