之前可能已经多次询问过,但我不知道如何从父母和孩子那里获得正确的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
答案 0 :(得分:1)
在连接之前进行聚合。在您的情况下,这有点复杂,因为co
和LEFT 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}}应该以此表开头,该表包含您要保留的所有行。