- ベストアンサー
SQL文がわからない
在庫テーブル・入庫テーブル・出庫テーブルがあります。 指定期間内の入庫テーブル・出庫テーブルの数量と在庫テーブルを結合させたいが、どうすればいいでしょうか? 2日ほど悩みましたがどうしても分かりませんでした。 よろしくお願いします <在庫テーブル> コード 個数 aaa 10 bbb 10 ccc 10 <入庫テーブル> コード 個数 日付 aaa 1 1/1 aaa 1 1/2 bbb 1 1/2 aaa 1 1/3 aaa 1 1/4 bbb 1 1/4 ccc 1 1/5 <出庫テーブル> コード 個数 日付 bbb 2 1/2 aaa 2 1/3 bbb 2 1/4 ccc 2 1/4 aaa 2 1/5 <結果(1/2~1/3)> コード 個数 入庫 出庫 aaa 10 2 2 bbb 10 1 4 ccc 10 0 2
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
select 在庫T.コード,個数,入庫,出庫 from 在庫T left join (select コード,sum(個数) as 入庫 from 入庫T where 日付 between '1/2' and '1/3' group by コード) as 入庫T2 on 在庫T.コード=入庫T2.コード left join (select コード,sum(個数) as 出庫 from 出庫T where 日付 between '1/2' and '1/3' group by コード) as 出庫T2 on 在庫T.コード=出庫T2.コード
その他の回答 (4)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#4回答者さんへ 勘違いだったかも知れません。 マニュアルでは、確かに4.1で実装となっているようです。 失礼しました。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
MySQLに、さほど詳しくないんですが・・ >バージョン5以降なら、サブクエリやビューなどが使用 >できますが、それより前なら使用できません。 バージョン4.1でサブクエリが実装されていると思うのですが?
- chukenkenkou
- ベストアンサー率43% (833/1926)
MySQLのバージョンは? バージョン5以降なら、サブクエリやビューなどが使用 できますが、それより前なら使用できません。 得られる結果が間違ってますよね? 1/2~1/3の結果なら、出庫は、bbbは2、cccは0ですよ? 在庫テーブルの個数が変わらないのも不思議です。 普通、商品マスタなどの商品コードと対応付けるように 思いますが? 簡略化のため、表名、列名をローマ字にしました。 日付はDATE型にしました。 LEFT JOINを使用のため、対応する行がないとNULLが 返るので、IFNULL関数で0にするようにしています。 SELECT ZAIKO.CODE,ZAIKO.KOSUU,IFNULL(X.NK,0),IFNULL(Y.SK,0) FROM ZAIKO LEFT JOIN(SELECT CODE,SUM(KOSUU) AS NK FROM NYUKO WHERE HIDUKE BETWEEN '2005-01-02' AND '2005-01-03' GROUP BY CODE) AS X ON ZAIKO.CODE=X.CODE LEFT JOIN(SELECT CODE,SUM(KOSUU) AS SK FROM SYUKKO WHERE HIDUKE BETWEEN '2005-01-02' AND '2005-01-03' GROUP BY CODE) AS Y ON ZAIKO.CODE=Y.CODE
お礼
chukenkenkouさん、ありがとうございます。 教えていただいたSQLでうまく行きました。 >MySQLのバージョンは? 記載するのをわすれました。5.0です。 今は4.0で運用しているのですがそろそろサブクエリが使えないバージョンでは限界が感じられたので5.0に替えようとしているところです。正式版も出たことですし。 >得られる結果が間違ってますよね? 間違っていました。すいません。 >在庫テーブルの個数が変わらないのも不思議です。 普通、商品マスタなどの商品コードと対応付けるように 思いますが? 記載している数は仮の数字です。実際にはこのような数にはなっていません。コードのところも商品マスタと紐付けされており商品名がでるようにしております。今回は分かりやすいように必要最低限のものだけにしておきました。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
索引の持ち方やデータ量に対する対象の比率によっては、 結合するよりも、テーブルを統合する方が効率が良いことも あるので、色々試してみると良いかも知れません。 (サブクエリの使えるバージョンでないとダメですが・・) select コード,sum(個数),sum(入庫),sum(出庫) from ( select コード,個数,0 as 入庫,0 as 出庫 from 在庫テーブル union all select コード,0 as 個数,個数 as 入庫,0 as 出庫 from 入庫テーブル where 期間条件 union all select コード,0 as 個数,0 as 入庫,個数 as 出庫 from 出庫テーブル where 期間条件 ) group by コード
お礼
k_o_r_o_c_h_a_nさん、ありがとうございます。 試してみたのですが、エラーが発生してうまく行きませんでした(errcode 1248 Every derived table must have its own alias)。 そのまま記載されているSQLを実行したわけではないので私のやり方がまずかったのかしれません。もう少し調査したいと思います。 unionを使うという方法もあるのかとこれはこれで勉強になりました。
お礼
7marineさん、ありがとうございます。 このSQLで欲しいデータが取得できました。 もう少しサブクエリを勉強します。