• 締切済み

SQLについて教えてください。

SQLについて質問があります。 あるテーブルの項目が、倉庫名、商品名、在庫数量とあった場合、 違う倉庫にある同一商品が数件あったとします。 例えば、  A倉庫 商品●● 10個  B倉庫 商品●● 20個  C倉庫 商品●● 5個  A倉庫 商品×× 3個  B倉庫 商品×× 15個  C倉庫 商品×× 0個 上記のような場合、●●商品についてはどれも在庫が1個以上 あるので通常に3件取得したいのですが、××商品はC倉庫が在庫0個です。 上記の様に0個の件数が1件でもあったら、その商品については 取得しない様なSQL式を1発で組むことは可能でしょうか? (上記の例の場合、●●商品3件のみ取得したい) 何故、SQL初心者で初歩的な質問で申し訳ありませんが よろしくお願い致します。

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

(1)数量がゼロのデータが少なく、数量でNULL値を持つものがない。 (2)商品に索引が作成されている。 状況なら。 create table zaiko ( souko char(1), shohin nvarchar(1), suryo int ) create index idx_shohin on zaiko (shohin) insert into zaiko values ( 'A', '●', 10 ); insert into zaiko values ( 'B', '●', 20 ); insert into zaiko values ( 'C', '●', 5 ); insert into zaiko values ( 'A', '×', 3 ); insert into zaiko values ( 'B', '×', 15 ); insert into zaiko values ( 'C', '×', 0 ); select * FROM ZAIKO where zaiko.shohin not in ( select shohin from zaiko where suryo = 0 ) という書き方が有効かも知れません。

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

下記の様な書き方も出来ますね。(テーブル名は仮に「在庫」としました) SELECT * FROM 在庫 a WHERE NOT EXISTS ( SELECT * FROM 在庫 b WHERE a.商品名 = b.商品名 AND b.在庫数量 = 0 ) WHERE 句は「商品名が同じで在庫数量が0のデータが存在しない」という条件を表現しています。

as_sh_yu
質問者

お礼

ありがとうございました。 記述も色々ありますね。 勉強になります。

回答No.1

こんばんは。 まぁ書き方はいろいろあるかと思いますが・・・、 SELECT 倉庫名, 商品名, 在庫数量 FROM テーブル A WHERE EXISTS (SELECT 商品名, SUM(1) AS FLAG_A, SUM(CASE WHEN 在庫数量 = 0 THEN 0 ELSE 1 END) AS FLAG_B FROM テーブル B WHERE A.商品名 = B.商品名 GROUP BY 商品名 HAVING FLAG_A = FLAG_B) とか・・・。

as_sh_yu
質問者

お礼

回答ありがとうございました。 また、お礼が遅くなり申し訳ありません。 早速試してみます。 ありがとうございました。

関連するQ&A

  • COBOLの動的SQLについて

    COBOLにおいて、動的にSQLを組みたいのですが、 取得する方法も含めてご教授願いませんでしょうか? 例) 条件により コード=1の場合、 SELECT A.ID,B.NAME FROM ID A,NAME B コード=2の場合、 SELECT A.ID,B.NAME,C.ADDRESS FROM ID A,NAME B,ADDRESS C のように条件により取得する項目も数もテーブルも違います。 この場合でのSQLの組み方とデータを取得する(FETCHの方法)がわかりません。 また、取得する件数も1件ではありません。 よろしくお願い致します。

  • SQL文で表すには

    以下の表を用いてSQL文を作成しようと思ってるんですが、途中までしか思いつかないので、どなたかご教授のほうよろしくお願いします。 shohin shiire 商品番号 商品名 単価   仕入番号 仕入先名  0001 みかん 100     001  A 0002 りんご 200     002 B 0003 ぶどう 300     003   C tran 購入番号 商品番号 仕入番号 数量 1 0001 001 1 2 0001 002 2 3 0001 003 3 4 0001 001 4 5 0001 002 5 6 0002 003 6 7 0002 001 7 8 0002 002 8 9 0003 003 9 10 0003 001 10 11 null 0004 20 これを以下のように出力するためにはどのようなSQL文を書けばよいですか? 商品番号 商品名 仕入番号 仕入先名 数量 単価 金額  0001 みかん 001    A   5 100 500  0001 みかん 002    B   7 100 700  0001 みかん 003    C   3 100 300  0002 りんご 001    A   7 200 1400  0002 りんご 002    B   8 200 1600  0002 りんご 003    C   6 200 1200  0003 ぶどう 001    A   10 300 3000  0003 ぶどう 003    B   9 300 2700  0004 null 004   null   20 null null ここまでは正しいと思うのですが・・・ select shohin.商品番号, shohin.商品名, shiire.仕入番号,     tran.数量, shohin.単価, tran.数量 * shohin.単価 as 金額 よろしくお願いします。

  • 複数値から一致するものがあるかどうかを調べる方法

    お世話になります。 SELECT文で複数の値の中から一致するものを検索する場合に、 以下の内容を満たすかどうかを結果として返したいです。 (1) A、B、C の値のうち、C があるかどうか (2) A、B、C の値のうち、いずれかを含んでいるかどうか 上記(1)、(2)のいずれの結果も取得したいのですが、 1つのSQLで結果を取得することは可能でしょうか? とりあえず、 SELECT 項目名 FROM TEST WHERE 項目名 IN (A, B, C) で取得件数が0件かどうか(※上記(2))を判断し、 結果をプログラム側(VB側)に保持させる。 取得件数が1件以上である場合、 取得結果を1件ずつループして Cを含むかどうか調べて、 もしCがあればその結果をプログラム側で保持しておく。 という方法しかわかりません。 SQLでこれを実現することは可能でしょうか? よろしくお願いいたします。

  • SQL文を教えてください

    A B C --------- 11 22 33 44 55 33 上記のように、同じ値を持つレコードが2件以上あるC列の値を取得するにはどのようなSQL文にすればよいでしょうか。 よろしくお願いします。

  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文について

    Select文についての質問です。 テーブルA,B, Cがります。  Aテーブルのカラム A1,A2, A3  Bテーブルのカラム B1, B2, B3  Cテーブルのカラム C1,C2, C3 A1=B1,A2=B2の  A3,B3 と、 A1=C1でC3がNULLでないCテーブルの件数 を一度に取得したい場合、どのようなSQL文になるでしょうか。 よろしくお願いします。

  • 商品テーブルと2つの在庫テーブルの結合ができない

    商品のデータベースがあるんですが、一つの商品テーブルに複数の店舗の商品をまとめて登録しています。在庫数は店舗別のテーブルで分けているのですが、これをSQLで商品コードで結合ができません。 仮に商品がA、B、Cと登録されていたとして、店舗1にはAとBの商品があるため2つの在庫数を設定しており、店舗2にはBとCの商品があるため2つの在庫数を設定しています。 つまり片方のみの商品もあれば両方に存在する商品があります。 このときにSQLで商品情報を取得する場合に、結合したいのですが結果が0件となり上手く結合ができません。 商品コードがBのときにSELECT文で両店舗の在庫数を同時に取得したいし、AやCではそれぞれの店舗在庫を取得したいのですが、何か良い方法はないものでしょうか?

    • ベストアンサー
    • MySQL
  • SQLの書き方(UPDATE文)

    SQLの書き方の質問です。 売上Tと商品Mというテーブルがあったとして、 売上Tには商品コード、数量、金額という項目が 商品Mには商品コード、単価という項目が それぞれあったとします。 売上Tの金額=売上T.数量×商品M.単価 この売上Tの金額を更新するのに、update文でできるだけシンプルに高速に動くSQL文を作成したいのですが、どのような書き方がよいと思いますか? 件数は例えば売上が100万件、商品が10万件あった場合を想定して。 以上よろしくお願いいたします。

  • Sql developerについての質問

    Sql developerについての質問 いつもお世話になります。 私はオラクル初心者で、オラクル11gを使用しています。 現在、Sql developerでpl/sql(ストアドプロシージャー)を 作成しています。 そして、躓いておりますのは、select内の構文で条件式を書いて いるのですが、そこでコンパイルエラーになってしまっています。 オラクルは、ifではなくdecodeを使うのか、又は条件式の内容が悪いのか 又は長すぎるのかご教示頂きたく、宜しくお願い致します。             記 decode ((a.最大在庫-(b.場内在庫-b.引当数量))>0, a.最大在庫-((TRUNC(b.場内在庫/b.入数,0))*b.入数)AS 補充数量,'-'), (a.最大在庫-(a.最大在庫-((TRUNC(b.場内在庫/b.入数,0))*b.入数))) AS 補充梱包数量,

  • SQLでのCOUNT関数の使い方

    表A           表B 商品ID 数量 価格    商品ID 商品名  ------ ---- ----    ------ ------ 0001   10 1000    0001  万年筆 0002   50 200     0002  ボールペン 0003   25 600     0003  シャーペン 0004   150 2000    0004  文房具セット 0005   20 420     0005  ノート SELECT 数量,価格,商品名,商品ID FROM 表A,表B WHERE 表A.商品ID = 表B.商品ID とやると恐らくこんなような表ができると思います。 商品ID 数量 価格 商品名  ------ ---- ---- ------ 0001  10   1000 万年筆 0002  50   200 ボールペン 0003  25   600 シャーペン 0004  150  2000 文房具セット 0005  20   420 ノート ここで、表の行数を6で割ったときの余りの数を表に追加して全体の行数を6の倍数にしたいと思っています。 (ID 0006として空行を追加) しかし、この表の行数を取得するためにCOUNT関数を使うと思うのですが、使い方が分かりません。 COUNT関数を使うにはGROUP BY句とHAVING句を扱うらしいのですがSELECT句にある列名全部をGROUP BY句に入れないといけないらしく思ったとおりのことが出来ません。 上記のSQLとCOUNT関数を1つのSQLで表の作成と行の行数を得たいと思っています。(ここでは、5行なので5という値を取得したい。) また、最後にどうやって空行を追加すれば良いかも分かりません。 具体的なSQLのソースなど、どなたか分かりましたら、教えてください。