• ベストアンサー

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

  • MySQL
  • 回答数5
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 7marine
  • ベストアンサー率36% (59/160)
回答No.1

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.コード

ataata28
質問者

お礼

7marineさん、ありがとうございます。 このSQLで欲しいデータが取得できました。 もう少しサブクエリを勉強します。

その他の回答 (4)

回答No.5

#4回答者さんへ 勘違いだったかも知れません。 マニュアルでは、確かに4.1で実装となっているようです。 失礼しました。

回答No.4

MySQLに、さほど詳しくないんですが・・ >バージョン5以降なら、サブクエリやビューなどが使用 >できますが、それより前なら使用できません。 バージョン4.1でサブクエリが実装されていると思うのですが?

回答No.3

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

ataata28
質問者

お礼

chukenkenkouさん、ありがとうございます。 教えていただいたSQLでうまく行きました。 >MySQLのバージョンは? 記載するのをわすれました。5.0です。 今は4.0で運用しているのですがそろそろサブクエリが使えないバージョンでは限界が感じられたので5.0に替えようとしているところです。正式版も出たことですし。 >得られる結果が間違ってますよね? 間違っていました。すいません。 >在庫テーブルの個数が変わらないのも不思議です。 普通、商品マスタなどの商品コードと対応付けるように 思いますが? 記載している数は仮の数字です。実際にはこのような数にはなっていません。コードのところも商品マスタと紐付けされており商品名がでるようにしております。今回は分かりやすいように必要最低限のものだけにしておきました。

回答No.2

索引の持ち方やデータ量に対する対象の比率によっては、 結合するよりも、テーブルを統合する方が効率が良いことも あるので、色々試してみると良いかも知れません。 (サブクエリの使えるバージョンでないとダメですが・・) 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 コード

ataata28
質問者

お礼

k_o_r_o_c_h_a_nさん、ありがとうございます。 試してみたのですが、エラーが発生してうまく行きませんでした(errcode 1248 Every derived table must have its own alias)。 そのまま記載されているSQLを実行したわけではないので私のやり方がまずかったのかしれません。もう少し調査したいと思います。 unionを使うという方法もあるのかとこれはこれで勉強になりました。

関連するQ&A

  • SQL文について

    お世話になります。 Oracle初心者です。 二つのテーブルから下記の様にデータを抽出 したいのですが、その方法をご教授くださいます様、 宜しくお願い致します。         記 テーブル1 品番  全長 aaa 1111 bbb 2222 ccc 3333 テーブル2 品番  入数 bbb 5 ddd 6 ggg 7 SQL結果 品番 全長  入数 aaa 1111 bbb 2222 5 ccc 3333 ddd 6 ggg 7

  • SQLについて

    SQLについてわからないのでご教授ください。 TABLE AAA コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 bbb 20100601 99999999 ccc 20100101 20110711 ccc 20110712 99999999 TABLE BBB コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 ccc 20100101 20110711 ・テーブルBBBの適用終了日が'99999999'のコードは テーブルAAAでは適用終了日が'99999999'の1レコードのみ。 ・テーブルBBBの適用終了日が'20100531'などの'99999999'以外は テーブルAAAでは適用終了日が'20100531'のレコードと、翌日'20100601'が適用開始日に設定され '99999999'が適用終了日に設定されたレコードの2レコードが存在。 上記2つが正常の状態です。 これらの条件に反する異常を検知するようなSQLを作りたいです。 たとえば、テーブルAAAのレコード[bbb 20100601 99999999]がない場合、 実行結果としてコード「bbb」が出力されるようなSQLが欲しいです。 異常がなければ、「なにも選択されませんでした。」でよいです。 条件として、 ・テーブルAAAでは「コード」「適用開始日」がPK ・テーブルAAAでは同じコードの「適用開始日」「適用終了日」の期間がかぶることはない ・テーブルAAAでは同じコードで3レコード以上は存在しない   (たとえば20100101~20100531、20100601~20100931、20101001~20101231の3つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。

  • Accessで、在庫表を作りたいのですが・・・

    いつも大変お世話になっております。m(_ _)m また質問させてください。 Accessで、在庫表を作っています。 「入庫情報_テーブル」と「出庫情報_テーブル」があり、それぞれのテーブルは、製品名(型番)と数量の情報を持っています。 入庫情報の数量はプラスして、出庫情報の数量はマイナスして、差引きの在庫表を作りたいのですが・・・ 入庫情報に入っている製品名のすべてを表示して、出庫情報の数量をマイナスする・・・というのは、「結合のプロパティ」で、入庫情報の全レコードと・・・というオプションを選べば可能です。 またその逆も可能なわけですが、両方を全部表示したい時はどうすればいいのでしょうか? つまり、入庫情報に入力されている商品で出庫情報にのっていないものと、出庫情報に入力されている商品で入庫情報にのっていないものがあるわけです。 在庫表では、それぞれのテーブルに存在するすべての製品名を載せ、型番が合致した場合は、入庫数量-出庫数量で在庫を出したいのです。 出庫情報にあって、入庫情報にないものというのは、つまり、在庫数がマイナスになるということです。 両方を同時に満たすには、どのようにすればいいのでしょうか? 質問の説明文が不足していたら指摘してください。 よろしくお願いします。

  • Accessで在庫管理をする際の日付の扱いについて

    いつも大変お世話になっております。m(_ _)m Accessで新規データベースを作成している最中です。 テーブルの作りを簡単に説明すると、 (1)「入庫受付」テーブルがあって、そこには、製品名・数量・入庫受付日等の情報が入っています。 (2)「出庫処理」テーブルがあって、そこにも、製品名・数量・出庫受付日等の情報が入っています。 この2つのテーブルを、期間を指定して、「在庫表」として出力する必要があります。 たとえば、当月のデータを見たい場合は、「10月度_在庫表」として、(1)の数量はプラス・(2)の数量はマイナスで、差引きの残(在庫数)を表示します。 このような目的でテーブルを作る場合に、ご相談なんですが、(1)(2)とも「日付」を入れるフィールドは「日付/時刻型」がいいのでしょうか? 期間を指定して数量を表示したい場合などは、この欄が「テキスト型」だとうまくいかないのでしょうか? なぜ、このような質問をするかというと、「日付/時刻型」にしておくと例えば「2006/10/30」という情報を入力したいときに、定型入力が使えませんよね?定型入力に「0000\/00\/00」と指定しておいて、日付は数字だけを入力すればいいようにしたいのですが、うまくいきません。 入力の簡単さを考えると「テキスト型」にしたいのですが、後々のことを考えると、たとえ入力が面倒でも「日付/時刻型」に設定しておくべきなのでしょうか? 回答をよろしくお願いします。

  • SQLの集計について教えてください。

    環境はoracle9iです。 ■テーブルの構成 |年度|月|部署コード|商品コード|金額| ■テーブルの内容 |2010|01|AAA|001|1000| |2010|02|AAA|001|2000| |2010|01|AAA|001|3000| |2010|01|AAA|002|3000| |2010|02|BBB|003|4000| |2010|01|CCC|001|5000| |2010|03|CCC|001|6000| 上記のようなテーブルがあり、 これを年度,月,部署コード,商品コードでサマリした値を表示したいです。 と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 そこに年度,部署コード,商品コードでサマリした 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) ■抽出結果の構成 |年度|月|部署コード|商品コード|金額|累計金額| ■抽出結果の内容 |2010|01|AAA|001|4000|6000| |2010|02|AAA|001|2000|6000| |2010|02|BBB|003|4000|4000| |2010|01|CCC|001|5000|11000| |2010|03|CCC|001|6000|11000| GROUP BYと別の集計単位で列を作ることが可能か、 可能であればどのようなSQLを書くべきか、 というところを教えてください。

  • SQLを教えてください

    SQLを教えてください 環境:SQLServer2000 下記のようなテーブルがあります。 商品    日付    入庫    出庫 Shouhin  Hiduke    In     Out ------------------------------------------  A    02/01    100         A    02/02           30  A    02/03    40           求めたい結果は以下のとおりで在庫になる残数を求めたいのです。 商品    日付    入庫    出庫   残数 Shouhin  Hiduke    In     Out   Zan --------------------------------------------------  A    02/01    100         100  A    02/02           30   70  A    02/03    40          110 SQLの初心者で申し訳ありませんがよろしくお願いします。

  • access2000です。

    こんばんは。 いつもお世話になります。 アクセスで困っております。教えてください。 テ-ブル1(原料マスター) コード  品名 100    A 200     B 300    C テーブル2(入出庫明細) 日付  コード  入庫  出庫 4/1   100    10 4/2   100          10 4/2      200    10 テーブル3(月初在庫) コード  在庫 100    10 200    100 300      50 クエリー1(入出庫の月合計) テーブル2より コード  入庫合計  出庫合計 100     10     10 200     10 クエリー2(在庫の算出) テーブル1の全コードを使用 コード  月初在庫 入庫合計 出庫合計 現在庫 100      10       10       10        10 200      100        10 300      50 となり、入庫や出庫にデータが入っていないコードのものは、現在庫が表示されません。入庫の合計は集計を合計としているだけです。現在庫はフィールドにビルドでテーブル1の月初在庫+入庫合計-出庫合計と入力しており、集計は演算としています。データの入っていないところを無視させて現在庫を全て表示させたいのです。 宜しくお願い致します。

  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

  • Accessで倉庫管理

    お世話になります。 現在Accessで在庫管理作成中です。 テーブル: 入庫:品番 品名 グループ 数量 使用者 日付 出庫:品番 品名 グループ 数量 使用者 使用状態 日付 グループ:1 消耗品        2 道具       3 機械 クエリ 消耗品在庫:入庫(消耗品)-出庫(消耗品) フォーム: 入庫フォーム、在庫フォームと出庫フォームを作成しました。 在庫フォームはクエリの元で作成しました。 以上のように作りました。 やりたいことは出庫フォームを入力する時、消耗品なら、数量を入力して、一旦在庫を確認して出したい数は在庫があれば、入力できます。そうではない場合はエラーでます。 言葉がうまく説明できないですのでイメージとしては Select Case グループID Case 1 If 数量<「在庫フォーム」の数量 Then  そのまま入力出来ます。在庫が減って行きます。 Else エアー Message box”在庫は足りません” こんな感じでコードに書き換えられますか?コードが弱いですので助けて下さい。 よろしくお願いします。  

  • SQL 複数条件を設定

    PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1   a-2   b-1    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd      2   ggg   bbb   ccc        3   bbb   mmm  ddd       4   ggg   mmm  ccc    : TABLE2   a-1   a-2        c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     1   bbb   aaa        eee         2   ggg   mmm       qqq    : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1   a-2   b-1  c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd  eee    2   ggg   bbb   ccc   ※    3   bbb   mmm  ddd   ※    4   ggg   aaa   ccc   qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。