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
試したのはこんな感じです。
結果として、「OUT_AMOUNT」が見つかりませんとなります。
UNION でつなげるには、どちらも同じFieldが必要です。
0でいいので同じFieldを作りましょう。
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
こんな感じにしてみましたがやっぱりだめです。
もう少し、教えてもらえませんか?
試していませんが・・・
AS IN_AMOUNT
AS OUT_AMOUNT
をどちらも、
AS AMOUNT
にして、UNION で つないだら、
1レコード目が入庫の数、
2レコード目が出庫の数に
なりませんか?
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
は個別にするとエラーなく表示はされるのでしょうか?
>>こんな感じにしてみましたがやっぱりだめです。
どうだめなのかわからないのですが、型があってなくてエラーがでるとか?
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を用意します。
細かい事ですがstudio-takeさんがコピペして動かないと言いそうなので
>>SUM(入庫.AMOUNT) AS IN_AMOUNT
,が抜けているのかと思います
みなさんありがとうございます。
HOtaさんのサンプル見ていたらUNIONの使い方が見えてきました。
宣言するフィールドの順番を互いにずらして、尊重したいフィールドに0を当てがうってことですか?
実際はすべて英字なんですが、HOtaさんの例のSQLが通りました。
結果は、
入庫 |出庫
70 |0
0 |50
同じレコードにならないんですね?
この合計を両方使うのって、Nextとかでカーソル移動が必要なんですか?
Firebirdの2.1までは、From句にsubQueryが使えませんので、別のレコードになります。
質問は、Unionについてだったのではないですか?
1レコードの出力にするなら、ストアドプロセジャーを使えば出来ます。
やりたいことが、UNIONで可能と思ったんですが。
明日、デモンストレーションしないといけないので、あきらめてふたつのクエリーで入庫と出庫を分けることにしました。
ストアドは能力不足によりまだ遠い道のりです。
いろいろありがとうございました。
ツイート | ![]() |