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

解決


studio-take  2012-07-11 04:31:43  No: 42581

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-11 04:47:55  No: 42582

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


HOta  2012-07-11 05:56:10  No: 42583

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


studio-take  2012-07-11 07:57:09  No: 42584

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-11 08:56:42  No: 42585

試していませんが・・・

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

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


初心者  2012-07-11 17:29:58  No: 42586

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 18:37:43  No: 42587

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 18:53:34  No: 42588

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


studio-take  2012-07-12 05:19:12  No: 42589

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

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

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


HOta  2012-07-12 17:37:20  No: 42590

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


HOta  2012-07-13 06:41:32  No: 42591

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


studio-take  2012-07-13 06:59:13  No: 42592

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加