如何根据其他3个表的每个可能组合对表中的一组行进行分组?

时间:2013-03-25 08:33:28

标签: sql postgresql grouping cross-join

以下是表格结构

Table A (id, name)
Table B (id, A-id)
Table C (id, quantity, B-id, D-id)
Table D (id, E-id, F-id)
Table E (id, name)
Table F (id, name)

我想得到像这样的结果

A.name | E.name | F.name | SUM(C.quantity) 
-------------------------------------------
foo    | aaa    | zzz    | 50
-------------------------------------------
foo    | aaa    | xxx    | 0
-------------------------------------------
foo    | bbb    | www    | 10
-------------------------------------------
bar    | aaa    | zzz    | 12
-------------------------------------------
bar    | aaa    | xxx    | 1
-------------------------------------------
bar    | bbb    | www    | 30
-------------------------------------------

我必须在AEF中显示所有条目,即使在C中没有与它们相关的条目。

所以基本上我必须按CAE的每种可能组合对F中的所有数据进行分组,如果有0则显示C {{1}}中没有可用的数据。

我该怎么做?

1 个答案:

答案 0 :(得分:3)

利用CROSS JOIN, LEFT [OUTER] JOINCOALESCE

如果你想要CROSS JOIN,这是非常不寻常的并且可能产生很多行,它可能看起来像这样。 在更新之后更加积极:bd现在也是可选的。

SELECT a.name AS a_name, e.name AS e_name, f.name AS f_name
      ,COALESCE(sum(c.quantity), 0) As sum_quantity
FROM   a
CROSS  JOIN e
CROSS  JOIN f
LEFT   JOIN b ON b.a_id = a.id
LEFT   JOIN d ON d.e_id = e.id
             AND d.f_id = f.id
LEFT   JOIN c ON c.b_id = b.id
             AND c.d_id = d.id
GROUP  BY 1,2,3;

由于缺乏规范,我只有在c b_id都匹配时加入d_id

评论中的附加Q

  

在你的最后一个答案中,你在交叉连接后加上一个括号,是什么   那呢?

我引用the manual here

  

如有必要,请使用括号来确定嵌套顺序。在   如果没有括号,JOIN会从左到右嵌套。在任何情况下加入   绑定比分隔FROM项目的逗号更紧密。