2017-11-06 3 views
0

総計の各部分の行が結合から決定される合計クエリを実行することは可能ですか?例えば各行の異なるcoloumnを参照してクエリを合計しますか?

私はテーブル

table A 
id | value 
1 | 10 
2 | 15 
3 | 10 

そして

table b 
id | b | c 
1 | 2 | 3 
2 | 1 | 2 

を持っている場合、SUMが参加し、直接のように行われるか、結合テーブルがからprequiredされるかSUM(tableA.value * tableB.<specific_column>)を行うことが可能です議論のために、文字列 "bcb"?

編集:

私は達成するために願っています最終結果はこれと同等のようになります。

SUM(SELECT value * b FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 1, 
    SELECT value * c FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 2, 
    SELECT value * b FROM tableA a JOIN tableB b ON b.id = 2 WHERE a.id = 3); 

私はこの2つの部分があります推測:シンプルがBからAと選択された値の結合Bが単一のselectValue列に縮小されるようにします。

ありがとうございました。コメントに尋ねたよう

+0

https://stackoverflow.com/questions/7432178/how-can-i-sum-columns-across-multiple-tables-in-mysql – dzm

+0

してください** [EDIT] **あなたの質問とあなたのサンプルに基づいて期待される出力を追加します。 –

+0

私は 'psql'タグを' postgresql'に置き換えました。 'psql'というタグは、データベース自体ではなく、Postgres用のデフォルトのコマンドラインクライアントを指します。 –

答えて

1

あなたが本当に望んでいる出力私たちを見るために良いはずですが、私はあなたのような何かをしたい理解として:

SELECT id, SUM(a.value * b.b) 
    FROM a JOIN b USING(id) 
GROUP BY id; 

それはあなたが何をしたいのか?私は実際にあなたが "bcb"ポイントを理解していません...

あなたのコメントであなたがSUM(値、値、値)と言っているわけではないので、私はあなたがそれらの値を追加したいと思います、 :

WITH 
sum1 AS (SELECT value * b AS res 
      FROM tableA a 
      JOIN tableB b ON b.id = 1 
      WHERE a.id = 1), 
sum2 AS (SELECT value * c AS res 
      FROM tableA a 
      JOIN tableB b ON b.id = 1 
      WHERE a.id = 2), 
sum3 AS (SELECT value * b AS res 
      FROM tableA a 
      JOIN tableB b ON b.id = 2 
      WHERE a.id = 3) 
SELECT SUM(sum1.res + sum2.res + sum3.res) 
    FROM sum1, sum2, sum3; 
+0

応答をありがとう。私は質問を編集しました、うまくいけば少し明確です。 – CBusBus

+0

@HervéPiedvacheクエリがNULLを返します。サブクエリが 'NULL'または2つのカラムを返すため、これは機能しません。サブクエリが1つの数値を返す場合にのみクエリが機能します。 – Dan

+0

この場合、各乗算にarroundを追加する必要があります:COALESCE(value * b、0)AS resこれは動作します。 –

0

私はエルヴェPiedvacheのコード@テストしてみたSELECT value * b AS val FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 1は、2つの行を持っているので、それは、NULLを返します。回避するには、次のようになります。

SELECT SUM(val) FROM 
    (SELECT value * b AS val FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 1 
    UNION 
    SELECT value * c AS val FROM tableA a JOIN tableB b ON b.id = 1 WHERE a.id = 2 
    UNION 
    SELECT value * b AS val FROM tableA a JOIN tableB b ON b.id = 2 WHERE a.id = 3) data; 
関連する問題