• ベストアンサー
  • すぐに回答を!

SQLでの複数検索条件の書き方を教えて下さい。

SQLを使うことが初めての、本当にど素人です。 質問の仕方自体おかしいかもしれませんが、どなたか下記条件でデータ抽出するSQLの書き方を教えて下さい。 【抽出条件】 1つの商品購入テーブルから、5月と6月に購入してて、7月と8月に購入していない、東京都と神奈川県在住の方の顧客IDと購入商品すべてを抽出できないでしょうか? カラムは、顧客ID、購入月、顧客都道府県、商品コードとそれぞれ分かれています。 この内容で、ご回答いただけますでしょうか? 何卒よろしくお願いします。

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

  • 回答数2
  • 閲覧数829
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.2

「今までに一度も購入したことがない人」であれば商品購入テーブルにいないので別ですが、今回は最低一回は購入した人が対象になっているので、差分をとるようなクエリが適当だとは思えないです。 いろいろ方法はあるでしょうけど、とりあえず購入月は数字で入っているとして考え方を示しますと、以下のようになります。 SELECT 顧客ID, 商品コード FROM 商品購入テーブル WHERE 顧客都道府県 IN ('東京都','神奈川県') AND 顧客ID IN (SELECT 顧客ID FROM 商品購入テーブル WHERE 購入月=5) AND 顧客ID IN (SELECT 顧客ID FROM 商品購入テーブル WHERE 購入月=6) AND 顧客ID NOT IN (SELECT 顧客ID FROM 商品購入テーブル WHERE 購入月 IN (7,8)) しかし、これはさすがに効率がよくないので、 「5月と6月に購入してて、7月と8月に購入していない]の部分はGROUP BYを使って一括で条件指定するのも手です。 SELECT 顧客ID, 商品コード FROM 商品購入テーブル WHERE 顧客都道府県 IN ('東京都','神奈川県') AND 顧客ID IN (SELECT 顧客ID FROM 商品購入テーブル WHERE 購入月 BETWEEN 5 AND 8 GROUP BY 顧客ID HAVING SUM(CASE WHEN 購入月=5 THEN 1 ELSE 0 END)>0 AND SUM(CASE WHEN 購入月=6 THEN 1 ELSE 0 END)>0 AND SUM(CASE WHEN 購入月 IN (7,8) THEN 1 ELSE 0 END)=0)

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

質問者からのお礼

回答ありがとうございます。 2つ目の方法で、うまくデータを抽出することができました。 1つ目の方法も、今後の参考に いろいろ試してみたいと思います。

関連するQ&A

  • 条件を複数与えたい

    お世話になります。 ネットショップでの送料の計算を行いたいのですが、どのようなSQL文が適切なのか、アドバイスを頂戴したく質問させて頂きます。 以下のようなテーブルがあり、都道府県、サイズ、送料が登録されています。 no  addr  size  price 1  大阪府 140  630 2  大阪府 160  840 3  福岡県 140  735 商品毎に商品サイズ、および発送先(都道府県別)によって、送料を抽出したいと考えているのですが、 1.同じ都道府県の登録、かつ不注意により同じサイズが登録されている。 ・・・この場合は、LIMIT 1として抽出。 2.該当するサイズが登録されていなかった。 ・・・この場合は、同じ都道府県から一番大きな金額を抽出。 3.該当する都道府県が登録されていなかった。 ・・・この場合は全てから一番大きな金額を抽出。 と、考えられる想定を事前に施しておきたいのですが、この場合どのようなSQL文になるのでしょうか? PHPで制作しているのですが、1つのSQL文が思いつかずTRUEとFALSEで処理する形になってしまい、該当する都道府県がなかった場合は、結果、3度もDBに問い合わせてしまう形になっています。 お忙しいなか恐縮ですが、アドバイスなど頂戴出来れば幸いです。 申し遅れましたが、DBはMySQLの5を利用しています。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL文 抽出条件 複数の場合のやり方

    下記のような状況では どのようにSQL文を書けばよいのか教えてください。 例) テーブルA 氏名ID 住所 12345 東京都XXX区XXXX町1-1-1 12346 埼玉県XXX市XXXX町1-2-1 ・・・ テーブルB 住所(詳細に記載されているものもあれば、都道府県レベルのものもある) 東京都XXX区XXXX町 東京都▲▲区○○ 北海道 埼玉県◆◆市 ・・・ テーブルBに書いていある住所で始まる 全ての氏名IDを テーブルAから取り出したい。

  • SQLのCOUNTについて

    顧客情報という表に都道府県を記した顧客住所という列があり、重複を一つにまとめたのち、 都道府県が何個あるか数えたいんですけど、方法がわかりません。 何かいい方法はありますでしょうか? イメージとしては以下のような感じです。 顧客住所 東京都| 東京都| 北海道| 北海道| 北海道| 愛知県| 愛知県|→埼玉県|→5(件)| 東京都| 沖縄県| 埼玉県| 沖縄県| よろしくお願いいたします。

その他の回答 (1)

  • 回答No.1
  • ml_4649
  • ベストアンサー率14% (123/860)

select 必要なフィールド from 商品購入テーブル where 5月に購入 and 6月に購入 and 7月に未購入 and 8月に未購入 and (東京在住 or 神奈川在住) ってな感じでしょうか?

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

質問者からの補足

さっそくの回答ありがとうございます。 こちらの説明不足と無知のため、さらに質問なのですが。。。 この商品購入テーブルは、購入した履歴が溜まっていくものなので、 未購入履歴がありません。 (顧客IDは持っているが、顧客IDの管理は別テーブルになります。) なので、5月と6月に購入している人たちと、7月と8月に購入している人たちを比べて、5月と6月しか購入していない人を抽出するというSQLの書き方を教えていただければと思います。 今回教えていただいた方法がそれを満たしているのかもしれませんが、 未購入者の出し方が分からないため、教えていただければと思います。 何卒よろしくお願いします。

関連するQ&A

  • SQL ServerのINNER JOINについて

    SQL Server 2008 R2のINNER JOINについて質問させて下さい。 ------------------------------ SELECT * FROM [Customer]    INNER JOIN Pref       ON Customer.CustomerPref1 = Pref.PrefId       ON Customer.CustomerPref2 = Pref.PrefId       ON Customer.CustomerPref3 = Pref.PrefId WHERE ([CustomerId] = 123) ------------------------------ 3つもONがあって変なSQL文となっております。 (当然SQLエラーとなります。) やりたい事は、 顧客フォーム[Customer]の中に、都道府県をプルダウン選択する項目が3つあります。 3つとも都道府県マスタテーブルをリレーション(FK)しております。 3つの都道府県項目で「都道府県名」をそれぞれSELECTするには、 どうしたらよいでしょうか? ご教授頂けますようお願い申し上げます。 ------------------ ▼DB情報 顧客情報テーブル:Customer 顧客ID:CustomerId 都道府県カラム1:CustomerPref1(1,2,3,~などの値が格納) 都道府県カラム2:CustomerPref2(1,2,3,~などの値が格納) 都道府県カラム3:CustomerPref3(1,2,3,~などの値が格納) 都道府県マスタテーブル:Pref 都道府県ID:PrefId(1, 2, 3,~などの値が格納) 都道府県名:PrefName(1:北海道, 2:青森県, 3:岩手県~などの値が格納)

  • FileMaker go 検索条件について

    FileMaker go で 都道府県の中から愛知県以外を抽出したいのですが、条件式はどのようになりますでしょうか? よろしくお願い致します。

  • Accessの選択クエリの抽出条件について

    いちもお世話になります。Access2002を勉強中の初心者です。 顧客テーブルから選択クエリを作っています。クエリのフィールドには「都道府県」(東京、埼玉、千葉...)と「顧客名」(山田、佐藤、田中...)があります。 「顧客名」の山田以外を抽出したいのですが、但し「都道府県」が東京の場合は山田以外の条件を外したいのです。つまり、埼玉、千葉の山田は抽出しませんが東京の山田は抽出したいのです。 このような抽出条件の設定ができますか? アドバイス、よろしくお願いします。

  • 英語の住所の書き方

    英語の住所の書き方って、 「番地-町-市-都道府県」みたいにさかのぼって書くようなのですが、 先日外国からネットで商品を購入する際に、 市と都道府県を入れ替えて書いてしまいました。 こういうのって商品が届かない可能性ってありますでしょうか。 英語でメールを送って相談する自信もないので、 すごく不安になっています。 こういう経験をされた方、またエアメールなどに詳しい方教えてください。

  • 検索2列で一致した個数を表す関数

    エクセル2000にある表1を元に表2を作成しようとしています。 表1 A列:「都道府県」 B列:「市区町村」 C列:「フラグ」 表2 D列:「都道府県」 E列:「件数」 F列:「フラグ数」 表1は既に値が入っていて、ある条件を見たすとC列(フラグ)に"○"がつきます。レコード自体が増える可能性はありますが、増える場合は一番下の列に追加される形で増えます。 表2はD列は既に値(都道府県名)が入っていて変わることはありません。E列とF列を関数で制御したいと思っています。(マクロは使用不可) E列は表2のE列に一致するA列の個数 F列はEの個数の中でC列のフラグが"○"の個数です。 E列は「COUNTIF」で書けましたが、 F列の関数が分かりません。 分かる人がいましたら、教えて下さい。 よろしくお願いします。 <表1>   A列   B列    C列   都道府県 市区町村  フラグ   --------------------------- 1 東京都   新宿区 ○ 2 東京都   豊島区 3 東京都   渋谷区 4 神奈川県  横浜市  ○ 5 神奈川県  厚木市  ○ <表2>   D列   E列    F列   都道府県 件数   フラグ数   ----------------------------- 1 東京都  3     1 2 神奈川県 2     2

  • 一度のsqlで値を取得するには

    mysql5です。 テーブル名pref(都道府県) id,name 1,北海道 2,青森県 3,秋田県 ・・・ テーブル名user(会員) id,pref_flg,addr01,addr02 1,1,市町村,それいかの住所 2,2,市町村,それいかの住所 3,3,市町村,それいかの住所 ・・・ 上記のようなテーブルであるとした場合userをselectしデータを取得します。 SELECT id, CONCAT(pref_flg, addr01, addr02) AS addr FROM user WHERE id = ? この結果addrには『1(※都道府県id)市町村それいかの住所』で取得できるのですが 一度のsqlで都道府県名も取得するにはどうすればできますか? 具体的には 『1(都道府県id)市町村それいかの住所』 を 『都道府県名市町村それいかの住所』 としてidではなく名称で取得したいです。 単純にuserに都道府県名を入れればできるのですが上記のように複数のテーブルで管理する場合の 方法を教えてください。

    • ベストアンサー
    • MySQL
  • SQL WHERE句 分岐?

    SQL Server 2005 を使っております。 WHERE句の分岐といいますか、記述の方法がわからないのですが、下記がその部分になります。 下記のコードを実行すると、都道府県、血液型、両方に何かしらのデータが入っているものしか抽出してきません。都道府県、血液型、どちらかの値がNullの場合でも、どちらかの条件が合致していれば、抽出したいのですが、どう記述すればよろしいでしょうか? 下記のコードが Null = Null を認識していれば このコードでも抽出してくるんでしょうが、 Null = Null だと抽出しないんですね。 何卒よろしくお願いいたします。 WHERE (IsNull(@A,dbo.テスト.都道府県) = dbo.テスト.都道府県) AND (IsNull(@B,dbo.テスト.血液型) = dbo.テスト.血液型

  • Accessフォーム 大分類→小分類を選択したい

    Access初心者です。 ほかの類似の質問を検索して試してみたのですが、 どうしても同じようにできません。 もう1週間も同じところでつまづいています。 どなたか、初心者にもわかるように教えていただければ幸いです。 以下のようなテーブルがあるとします。 [都道府県] [市区町村] 東京都  新宿区 東京都  港区 東京都  渋谷区 神奈川県  横浜市 神奈川県  川崎市 神奈川県  藤沢市 埼玉県  さいたま市 埼玉県  熊谷市 埼玉県  三郷市 フォーム上で、 [都道府県]のコンボボックスで東京都を選んだ場合、 [市区町村]のコンボボックスには「東京都」の市区町村名が 選択できるようにしたいのですが、 一番最初のところで行き詰っています。 コンボボックスウィザードにしたがって [都道府県]のコンボボックスを作成すると、 [東京都] [東京都] [東京都] [神奈川県] [神奈川県] [神奈川県] … というリストが出てきてしまいます。 過去の質問を検索し、プロパティの値集合ソースで、 SELECT[都道府県]…FROM[テーブル名]の後に、 GROUP BY[都道府県]と書き加えたのですが、 こうするとリストが出てこなくなります。 いったいどうしたらよいのでしょうか。 ほとほと困っています。 どうかご教示ください。お願いいたします。

  • Access フォームからの検索について

    サイトを見ても自分の合致するものが見つからなかったので、 ご教授いただけると助かります。 A,B,Cという3つのテーブルがあります。 A.エリア ---------------------- エリアコード|エリア名 ---------------------- 1|関東 2|関西 ---------------------- B.都道府県 -------------------------- 都道府県コード|都道府県名 -------------------------- 1|東京 2|大阪 -------------------------- C.商品情報 ------------------------------------------------- 商品ID|商品名|開始日付|終了日付|エリアコード|都道府県コード ------------------------------------------------- 1|みかん|20111201|20111231|1|1| 2|りんご|20111201|20111231|1|1| 3|ぶどう|20111201|20111231|2|2| ------------------------------------------------- 検索フォームにはテキストでエリア名、都道府県名、商品名をそれぞれ入力でき、 その条件に合致したデータの商品IDと商品名だけを引っ張ってこれるようなものを作りたいと思っているのですが、 まずどのようにしたらいいのかも不明です・・・・。 フォームだけは作成したのですが、それからどのように紐付すればいいのか ご教授いただけると助かります。 よろしくお願い致します。

  • フレームでの条件による画面切り替え

    フレームを使用して上下に分けた画面で、 上の画面(A)のリンクボタンを押したら 下の画面(B)を切り替える動作をしたいと 思っています。 Aには都道府県の名称のリンクボタンがあり、 BはDBからAで指定した都道府県の情報を 抽出してリスト表示させたいのです。 AにはBを呼び出す動作を、 Bにはその検索/表示の操作を作成すればと思い、 Bの1都道府県分の結果表示まではできたのですが、 Aの呼び出し方法と、 BでAの指定を受け取って検索を切り替える方法がわかりません。 (Bを都道府県別に1つ1つファイルを分ける方法しかない??) SQL>SELECT ID,NAME FROM USER WHERE AREA=1 ※AREA=1の部分が都道府県指定(ここをAno選択により切り替える方法があるか) プログラム初心者のためうまく文書になっていないかもしれませんが、 コメントよろしくお願いします。

    • ベストアンサー
    • PHP