0

PostgreSQLを実行していて、同じ列名と形式の複数(10以上)のテーブルがあり、それらの2つの列を合計したいと思います。テーブルの1つに行がない場合は、0(ゼロ)と見なす必要があります

2つのテーブルの例:

TableA:

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以上のテーブルを結合するために有効である必要があります

4

3 に答える 3

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
   ;
于 2013-02-24T21:22:07.953 に答える
1

すべてのテーブルを結合してから、主キーでグループ化します。値の合計は、探している結果になります。

于 2013-02-24T21:17:52.097 に答える
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;
于 2013-02-24T22:36:28.403 に答える