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

标签 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+ 表有效

最佳答案

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
   ;

关于sql - 在 FULL JOIN 中添加多列,假设空行为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15056704/

相关文章:

sql - 找到保存外键的记录

mysql - 联合运营商的替代方案

python - 在 Python/Django 中从 STDIN 复制到 POSTGRESQL(在 Heroku 上)

sql - 使用第一个查询的值执行第二个查询

php - 输入数据后创建的自定义字段

mysql - 选择不同的列和条目计数

mysql - 如何在mySQL中同时选择和更新一条记录?

postgresql - 在 ecto 中使用 generate_series 并传递一个值

mysql - 如何查找一列以返回我需要在一个 mysql 调用中连接表的列

MySQL从三个表中过滤行