在FULL JOIN中添加多个列,假设空行为零

时间:2013-02-24 21:08:42

标签: sql postgresql join postgresql-9.1 outer-join

我运行PostgreSQL并且我有多个(10+)表具有相同的列名和格式,我想总结两个列。 如果其中一个表中缺少某行,我需要将其视为0(零)

双桌示例:

表A:

primkey | year | month | day | data_value
--------+------+-------+-----+-----------
20120101| 2012 |  01   |  01 |    3.7
20120102| 2012 |  01   |  02 |    1.0

表B:

primkey | year | month | day | data_value
--------+------+-------+-----+-----------
20120101| 2012 |  01   |  01 |    1.3
20120103| 2012 |  01   |  03 |    5.5

通缉输出:

primkey | year | month | day | data_value
--------+------+-------+-----+-----------
20120101| 2012 |  01   |  01 |    5.0
20120102| 2012 |  01   |  02 |    1.0
20120103| 2012 |  01   |  03 |    5.5

我在考虑这样做:

SELECT a.primkey, a.year, a.month, a.day, a.data_value+b.data_valueas data_value FROM "TableA" as a FULL JOIN "TableB" as b ON a.primkey = b.primkey;

但它产生了这个(缺少一些data_values):

primkey | year | month | day | data_value
--------+------+-------+-----+-----------
20120101| 2012 |  01   |  01 |    5.0
20120102| 2012 |  01   |  02 |    
20120103| 2012 |  01   |  03 |   

注意:primkey是唯一的并且是PRIMARY KEY,这需要对加入10+表有效

3 个答案:

答案 0 :(得分:2)

SELECT COALESCE(a.primkey, b.primkey) AS primkey
  , COALESCE(a.year, b.year)          AS year
  , COALESCE(a.month, b.month)        AS month
  , COALESCE(a.day, b.day)            AS day
  , COALESCE(a.data_value,0) + COALESCE( b.data_value, 0) AS data_value
FROM "TableA" AS a
FULL JOIN "TableB" AS b ON a.primkey = b.primkey
   ;

答案 1 :(得分:1)

联合所有表,然后按主键分组。值的总和将是您要查找的结果。

答案 2 :(得分:1)

按照亚伯拉罕的建议,这是实际的代码:

SELECT x.primkey, x.year, x.month, x.day
   , sum(data_value) AS data_value 
FROM 
  (SELECT * FROM "TableA" 
   UNION ALL 
   select * FROM "TableB") 
AS x 
GROUP BY primkey, year, month, day;