2009-09-07 7 views
11

2つの異なるテーブルからいくつかの列の合計を取得したい(これらのテーブルは同じ構造を共有します)。2つのテーブルから複数の列の合計を取得する

私は1つのテーブルのみを考慮すれば、私は、クエリのこの種の記述します。

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
    FROM T_FOO 
    WHERE seller = XXX 
    GROUP BY MONTH_REF; 

しかし、私は、テーブルT_BARからのデータを操作したいと思いますし、Return selectクエリを持っているが次の列:

  • MONTH_REF
  • SUM(T_FOO.amount1)+ SUM(T_BAR.amount1)
  • SUM(T_FOO.amount2)+ SUM(T_BAR.amount2)

すべてはMONTH_REFの値でグループ化されています。

ある特定のMONTH_REFのレコードは、あるテーブルでは見つかりますが、他のテーブルでは見つからないことに注意してください。 この場合、T_FOO.amount1 + 0(または0 + T_BAR.amount1)の合計を取得したいと考えています。

この情報を取得するにはどうすればSQLクエリを書くことができますか?

詳細については、私のデータベースはOracle 10gです。

答えて

12

あなたはすることができます(これにより、グループの前に組合あなたのテーブルがOracleでありますちなみに):

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2 
      FROM T_FOO 
     WHERE seller = XXX 
     UNION ALL 
     SELECT month_ref, amount1, amount2 
      FROM T_BAR 
     WHERE seller = XXX 
     ) t 
GROUP BY t.month_ref 

また、それによって、売り手フィールドとフィルタとの連合テーブルは、後に(場合には、あなたは)もっと高度なロジックが必要になる場合があります

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2, seller 
      FROM T_FOO 
      UNION ALL 
     SELECT month_ref, amount1, amount2, seller 
      FROM T_BAR) t 
    where t.seller = XXX 
    GROUP BY t.month_ref 
+0

最後に、Lievenソリューションよりも明確ですので、私はあなたのソリューション(最初のもの)を好む... – romaintaz

+0

'WHERE'節をサブ' SELECT'の外に移動するよりも早く行数を減らすので、効率的です。 – JohnB

+0

ありがとう私は2番目を使用しました。 –

2

ユニオンを使ってみましたか?また

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) AS amount1, SUM(amount2) as amount2 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
+0

@romaintaz:問題ありません。 1つの質問、あなたはさまざまなソリューションをプロファイリングしましたか? * * by * union - * grouping by *ソリューションは、単に* union - groupingより*大きなデータセットで*のグループ化が速くなると仮定します。 –

1

、外部結合でも動作するはずです:

SELECT month_ref, 
     SUM(t_foo.amount1) + SUM(t_bar.amount1), 
     SUM(t_foo.amount2)+SUM(t_bar.amount2) 
FROM t_foo FULL OUTER JOIN t_bar 
     ON t_foo.month_ref = t_bar.month_ref 
GROUP BY month_ref 
+0

このクエリは(特にLievenの回答と比較して)時間がかかりすぎ、また間違った結果を返します。それ以外の場合は、NVL(SUM(...)、0)が必要です。そうでなければヌル値を返します... – romaintaz

1

私は最終的にこれはLievenの答えを使用して作業します。ここで

は(amount1 = ...が私の環境で動作していない、と;あまりにも多くのクエリである)正しいコードです:

SELECT MONTH_REF, SUM(sumAmount1), SUM(sumAmount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) as sumAmount1, SUM(amount2) as sumAmount1 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
-1
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts 
+0

問題解決の理由と解決方法について、ご意見をお聞かせください。 –

+0

このコマンドは完了していません.... – taboubim

関連する問題