我运行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+表有效
答案 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;