如何跨两个不相关的表执行SUM?

时间:2012-10-22 23:46:19

标签: sql postgresql sum

我试图用postgres总结两个不相关的表。使用MySQL,我会做这样的事情:

SELECT SUM(table1.col1) AS sum_1, SUM(table2.col1) AS sum_2 FROM table1, table2

这应该给我一个包含两个名为sum_1和sum_2的列的表。但是,postgres没有给我这个查询的任何结果。

有什么想法吗?

3 个答案:

答案 0 :(得分:11)

SELECT (SELECT SUM(table1.col1) FROM table1) AS sum_1,
       (SELECT SUM(table2.col1) FROM table2) AS sum_2;

你也可以把它写成:

SELECT t1.sum_c1, t1.sum_c2, t2.sum_t2_c1
FROM
(
     SELECT SUM(col1) sum_c1,
            SUM(col2) sum_c2
 FROM table1
) t1
FULL OUTER JOIN
(
     SELECT SUM(col1) sum_t2_c1
     FROM table2
) t2 ON 1=1;

FULL JOIN与dud条件一起使用,因此任何子查询都不会产生任何结果(空)而不会导致更大的查询没有结果。

我认为你所写的查询不会产生你期望获得的结果,因为它在table1和table2之间进行CROSS JOIN,这会使每个SUM通过另一个表中的行数膨胀。请注意,如果table1 / table2为空,则CROSS JOIN将导致X行乘以0行以返回空结果。

查看此SQL Fiddle并比较结果。

答案 1 :(得分:1)

我建议如下,但我还没有尝试过。

select sum1, sum2
from
   (select sum(col1) sum1 from table1),
   (select sum(col1) sum2 from table2);

这个想法是创建两个内联视图,每个视图都有一行,然后在这两个视图上进行笛卡尔连接,每个视图都有一行。

答案 2 :(得分:1)

要合并来自多个表的多个聚合,请使用CROSS JOIN

SELECT sum_1, sum_2, sum_3, sum_4
FROM 
    (SELECT sum(col1) AS sum_1, sum(col2) AS sum_2 FROM table1) t1
CROSS JOIN
    (SELECT sum(col3) AS sum_3, sum(col4) AS sum_4 FROM table2) t2

总是来自任一子查询的一行,即使源表中没有行也是如此。因此,CROSS JOIN(或者甚至只是子查询之间的一个低位逗号 - 对于具有较低优先级的交叉连接而言不是那么容易阅读的简写)是最简单的方法。

请注意,这会在单个聚合行之间产生交叉连接,多个表的各个行之间的交叉连接,就像问题中的错误语句一样 - 从而相互相乘。