2つの異なるテーブルからいくつかの列の合計を取得したいと思います(これらのテーブルは同じ構造を共有しています)。
テーブルを1つだけ検討する場合は、次のようなクエリを記述します。
SELECT MONTH_REF, SUM(amount1), SUM(amount2)
FROM T_FOO
WHERE seller = XXX
GROUP BY MONTH_REF;
ただし、テーブルT_BARのデータも処理してから、次の列を返すselect
クエリを作成したいと思います。
MONTH_REF
の値でグループ化されたすべて。
特定のMONTH_REF
のレコードは、一方のテーブルにはありますが、もう一方のテーブルにはありません。この場合、T_FOO.amount1 + 0
(または0 + T_BAR.amount1
)の合計を取得したいと思います。
この情報を取得するためにSQLクエリを作成するにはどうすればよいですか?
参考までに、私のデータベースはOracle10gです。
グループ化の前にテーブルを結合できます(ちなみに、これは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
ユニオンを使ってみましたか?
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
または、外部結合も機能するはずです。
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
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