入出庫をUNION句でつなげたいのですが

解決


studio-take  2012-07-10 19:31:43  No: 42581  IP: 192.*.*.*

FireBirdで入庫テーブルと出庫テーブルをつなげようと思っているのですが、
UNION句は初めてで、勝手が分かりません。
よろしくお願いします。

入庫テーブルと出庫テーブルをつないで、
入庫の数をSUM() AS IN_AMOUNT
出庫の数をSUM() AS OUT_AMOUNT
として並記したいのです。

SELECT SUM(入庫.AMOUNT) AS IN_AMOUNT
FROM 入庫
WHERE 入庫.MATERIALCODE = :MATERIALCODE1
GROUP BY 入庫.MATERIALCODE

UNION ALL

SELECT SUM(出庫.AMOUNT) AS OUT_AMOUNT
FROM 出庫
WHERE 出庫.MATERIALCODE = :MATERIALCODE2
GROUP BY 出庫.MATERIALCODE

試したのはこんな感じです。

編集 削除
studio-take  2012-07-10 19:47:55  No: 42582  IP: 192.*.*.*

結果として、「OUT_AMOUNT」が見つかりませんとなります。

編集 削除
HOta  2012-07-10 20:56:10  No: 42583  IP: 192.*.*.*

UNION でつなげるには、どちらも同じFieldが必要です。
0でいいので同じFieldを作りましょう。

編集 削除
studio-take  2012-07-10 22:57:09  No: 42584  IP: 192.*.*.*

SELECT 0 AS MARGE, SUM(入庫.AMOUNT) AS IN_AMOUNT
FROM 入庫
WHERE 入庫.MATERIALCODE = :MATERIALCODE1
GROUP BY 入庫.MATERIALCODE

UNION ALL

SELECT 0 AS MARGE, SUM(出庫.AMOUNT) AS OUT_AMOUNT
FROM 出庫
WHERE 出庫.MATERIALCODE = :MATERIALCODE2
GROUP BY 出庫.MATERIALCODE

こんな感じにしてみましたがやっぱりだめです。
もう少し、教えてもらえませんか?

編集 削除
igy  2012-07-10 23:56:42  No: 42585  IP: 192.*.*.*

試していませんが・・・

AS IN_AMOUNT
AS OUT_AMOUNT
をどちらも、
AS AMOUNT
にして、UNION で つないだら、

1レコード目が入庫の数、
2レコード目が出庫の数に
なりませんか?

編集 削除
初心者  2012-07-11 08:29:58  No: 42586  IP: 192.*.*.*

SELECT 0 AS MARGE, SUM(入庫.AMOUNT) AS IN_AMOUNT
FROM 入庫
WHERE 入庫.MATERIALCODE = :MATERIALCODE1
GROUP BY 入庫.MATERIALCODE

SELECT 0 AS MARGE, SUM(出庫.AMOUNT) AS OUT_AMOUNT
FROM 出庫
WHERE 出庫.MATERIALCODE = :MATERIALCODE2
GROUP BY 出庫.MATERIALCODE
は個別にするとエラーなく表示はされるのでしょうか?

>>こんな感じにしてみましたがやっぱりだめです。
どうだめなのかわからないのですが、型があってなくてエラーがでるとか?

編集 削除
HOta  2012-07-11 09:37:43  No: 42587  IP: 192.*.*.*

SELECT
   SUM(入庫.AMOUNT) AS IN_AMOUNT
   0 AS OUT_AMOUNT
FROM 入庫
WHERE 入庫.MATERIALCODE = :MATERIALCODE1
GROUP BY 入庫.MATERIALCODE

UNION ALL

SELECT
   0 AS IN_AMOUNT,
   SUM(出庫.AMOUNT) AS OUT_AMOUNT
FROM 出庫
WHERE 出庫.MATERIALCODE = :MATERIALCODE2
GROUP BY 出庫.MATERIALCODE

のように、Unionする両方のテーブルに同じFieldを用意します。

編集 削除
初心者  2012-07-11 09:53:34  No: 42588  IP: 192.*.*.*

細かい事ですがstudio-takeさんがコピペして動かないと言いそうなので
>>SUM(入庫.AMOUNT) AS IN_AMOUNT
,が抜けているのかと思います

編集 削除
studio-take  2012-07-11 20:19:12  No: 42589  IP: 192.*.*.*

みなさんありがとうございます。
HOtaさんのサンプル見ていたらUNIONの使い方が見えてきました。
宣言するフィールドの順番を互いにずらして、尊重したいフィールドに0を当てがうってことですか?

実際はすべて英字なんですが、HOtaさんの例のSQLが通りました。
結果は、
入庫  |出庫
70    |0
0     |50

同じレコードにならないんですね?
この合計を両方使うのって、Nextとかでカーソル移動が必要なんですか?

編集 削除
HOta  2012-07-12 08:37:20  No: 42590  IP: 192.*.*.*

Firebirdの2.1までは、From句にsubQueryが使えませんので、別のレコードになります。
質問は、Unionについてだったのではないですか?

編集 削除
HOta  2012-07-12 21:41:32  No: 42591  IP: 192.*.*.*

1レコードの出力にするなら、ストアドプロセジャーを使えば出来ます。

編集 削除
studio-take  2012-07-12 21:59:13  No: 42592  IP: 192.*.*.*

やりたいことが、UNIONで可能と思ったんですが。
明日、デモンストレーションしないといけないので、あきらめてふたつのクエリーで入庫と出庫を分けることにしました。
ストアドは能力不足によりまだ遠い道のりです。

いろいろありがとうございました。

編集 削除