• ベストアンサー
  • 困ってます

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
  • 閲覧数413
  • ありがとう数4

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

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

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

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

その他の回答 (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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • エクセルデータの抽出について

    ご教授下さい。。。。 管理番号 日付    移動先 移動先詳細 移動先詳細(2) 移動区分 ・ ・ K001 2013/4/1 AAA  1234   1     出庫 K002 2013/4/5 ZZZ   -      -     入庫 K001 2014/5/1 ZZZ   -      -     入庫 K001 2014/5/5 BBB  1244  3     出庫 K003 2013/6/1 CCC  1266  2     出庫 ・ ・ 上記のデータから以下のように最新データを表示するようにしたい 管理番号 日付    移動先 移動先詳細 移動先詳細(2) 移動区分 K001 2014/5/5 BBB  1244  3     出庫 K002 2013/4/5 ZZZ   -      -     入庫 K003 2013/6/1 CCC  1266  2     出庫 完全にお手上げです。 どなたか宜しくお願いいたします。

  • 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の月初在庫+入庫合計-出庫合計と入力しており、集計は演算としています。データの入っていないところを無視させて現在庫を全て表示させたいのです。 宜しくお願い致します。

  • アクセスでの在庫管理(在庫期間が知りたい)

    アクセスを使って商品の在庫管理を行おうと試行錯誤しています。 1.入庫テーブル(商品名、入庫日、入庫数)に入力。 2.出庫テーブル(商品名、出庫日、出庫数)に入力。  これらから、商品と入庫日をロット単位とし、このように在庫を計算しています。  入庫の合計―出庫の合計=在庫 ここからネックになっているのが、在庫期間をどうあらわすかと言う点です。  通常、今日までの在庫期間は   在庫期間=今日―入庫日  によって表しています。  ここまでは出来ていますが、さらに一歩進めて  日にちを毎回指定し   指定日からの在庫期間=指定日―入庫日  のような感じで在庫期間を表示させたいのですが どのようにクエリを作ったらよいのでしょうか? このようなフローで良いのか、 参考HP等ありましたらアドバイス頂けませんか?

  • 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

  • access 更新クエリ?追加クエリ?

    access超初心者です。 いま、下記のような在庫表をつくっています。 (出庫テーブルは省略してます) 入庫テーブル  ID  入庫日付  大分類  中分類  小分類  数量   在庫テーブル  ID  大分類   中分類   小分類  最初の数  入庫数   出庫数 入庫更新クエリ *入庫→在庫  大分類        中分類           小分類 ・入庫の全レコードと在庫表の同じ結合フィールドのレコードだけを含める で結合しています。 *在庫表の入庫数  レコードの更新で  NZ([在庫数]![入庫数],0)+NZ([入庫]![数量],0) といれています。 入庫テーブルに入力していき その都度、 入庫更新クエリにて更新し 在庫表に反映させていきたいと思っています。 入庫表には、この先 在庫表にないものもでてくるので 在庫表にないものは 追加、あるものは、更新としていきたいです。 今の状態だと 入庫表のものは、更新クエリでいったん在庫表に反映されるのですが 入庫表にレコードを追加して また更新クエリをかけると 在庫表が、前に更新したレコードの分も 重複して反映してしまいます。 これをなくすには、どういった方法が ありますか? 宜しくお願いいたします

  • ご教授お願い致します。

    ご教授お願い致します。 MicrosoftSQL2008で テーブルに在庫データと受払データの2種類があります。 在庫データは受払データを1行にまとめた情報で 年月で管理しています。 また、受払データはその詳細で年月日で管理しています。 質問は、この二つのテーブルをビューで1つに結合したいのですが 結合に在庫データの年月と受払データの年月日だと特定の日付のみしか 結合されません。 よって、方法を教えて頂ければ幸いです。 尚、例を下に記述します。 ■在庫データ 年月    品番 入庫数 出庫数 2010/06/01 A   3    1 2010/07/01 A 0 1 ■受払データ 伝票No. 日付  品番 入出庫区分 数量 1 2010/06/02 A 入庫    1 2 2010/06/03 A 入庫    2 3 2010/06/04 A 出庫    1 4 2010/07/02 A 出庫    1    結合は在庫データの2010/06/01だと受払データの  伝票No.が1から3まで  2010/07/01だと伝票No.4です。

  • 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の初心者で申し訳ありませんがよろしくお願いします。

  • SQL文を教えてください。

    すみません、SQLを教えてください。 ID, 名前の2つのフィールドを持つテーブルがあります。 中身は以下のように入っています。 1, AAA 2. AAA 2, BBB 3, CCC 3, AAA 4, DDD 5, EEE, 5, DDD これを、名前のダブリをスキップしながら、 IDの大きな順番に名前を取り出したいのです。 結果は、以下のようになればいいです。 DDD EEE AAA CCC BBB どのようなSQLを組んだら実現できますか? よろしくお願いいたします。

  • activereportの計算式

    VB6.0でactivereportを使っています。 日付    品名  品番 入庫 出庫 在庫数  2006/08/01 りんご 0001  3     3   2006/08/01 りんご 0001     1  2   2006/08/01 りんご 0002  8   2  6 というように今在庫テーブルには品番ごとの在庫数が入っています。 それをactivereportへ出力するときに 品番を無視して在庫数を計算したいのですが どうすればいいのでしょうか? 日付    品名  品番 入庫 出庫 在庫数  2006/08/01 りんご 0001  3     3   2006/08/01 りんご 0001     1  2   2006/08/01 りんご 0002  8   2  8 というようにしたいのです。 前日の実在個数+入庫-出庫という方法を考えています どこをどのようにしたらいいのかがわかりません。 教えてください。 よろしくお願いします。

  • SQL文で在庫推移を得る。

    初期在庫数と入庫数と出庫数で現在の在庫数を得るSQL文を作りたいです。例としては下記のような感じです。 単純なようですが、以外と難しく、すでに作成されていれば教えて頂きたいと思います。ヒントになることでも構いません。 ここでは在庫と言っておりますが、キャッシュフロー全てに通用すると思います。ご興味のある方、挑戦してみてはいかがでしょう。 P.S.昨日SQL文の質問をさせて頂きました。今日もSQLで悩んでおります。 例: 日付|初期在庫|入庫|出庫|在庫 1/1 |10   |  |  |10 1/2 |    |3  |  |13 1/3 |    |6  |3  |16 1/4 |    |9  |10 |15 1/5 |    |1  |  |16 1/6 |    |  |10 |6 1/7 |    |  |1  |5