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

SQL文 複数条件の場合の書き方

初めて質問します。 下記のようなデータが存在します。 テーブルA NO DATE GYO 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 3 2010/12/02 1 <= 4 2010/12/03 1 4 2010/12/03 2 上記データにて、<=の行の値を取得し変数へ代入したとします。 変数.NO =3 変数.日付 =2010/12/02 変数.GYO =1 上記、変数を元に1件前のレコードを抽出したいのですが SQL文でのいい方法がわかりません。 取得したいレコード 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 どうかお願いいたします。

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

  • 回答数3
  • 閲覧数367
  • ありがとう数4

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

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

こんばんは。 単純に文字列結合して、小さいものを取ればいいのでは? DATEカラムがDATE型、GYOカラムがNUMBER型と仮定します。 違ってたら、適当に型変換してください・・・。 SELECT * FROM テーブルA WHERE TO_CHAR(DATE,'YYYYMMDD')||RPAD(TO_CHAR(GYO),3,'0') < 同じように変換した、対象データ やってる事は一緒です。 ただ、SQLでやってるだけ・・・。

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

質問者からのお礼

遅くなり申し訳ございません。 ご回答ありがとうございました。 SQL文でカラム同士を結合できるのですね。 すみません。勉強不足でした。 大変、参考になりました。ありがとうございました。 また、今後ともよろしくお願いいたします。

関連するQ&A

  • SQL文がわかんないっす…

    レコードを抽出するためのSQL文を教えてください。 テーブルは下記の通りです。 goodsID, stockNum, reservNum, date 1, 5, 4, 2008-11-4 2, 5, 3, 2008-11-4 2, 5, 2, 2008-11-5 :以下続く : で、2008年11月4日と、2008年11月5日の、(stockNum - reservNum) が両方とも2以上のgoodsID、つまり2を取得したいのです。 また、もし3以上と指定した場合は取得結果を空にしたいです(3つ目のレコードだけが取れると困ります)。 日付の範囲は可変です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文が上手く記述できません・・。

    <<テーブル名:master>> SHOUHIN NO  KOSU ------- --- --------------- A       1   500 A       2   100 A       2   300 A       2   200 A       3   220 A       3   150 A       4   200 A       4   300 A       4   100 <<抽出結果>> SHOUHIN    NO1    NO2    NO3    NO4    GOUKEI -------    ---    ---    ---    ---    ------ A        500    600    370    600    2070 上記のmasterテーブルから、NO毎にKOSUの値を集計して 1レコードにまとめて下記の抽出結果のようにデータを抽出したいと 考えているのですが、なかなか上手くSQLを記述する事が出来ません・・・。 下記のような結果を抽出することは可能でしょうか? ご存知の方がいらっしゃれば、ご教授頂ければ幸いです。 宜しくお願い致します。

  • SQL(SELECT文)を教えてください

    SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付)  Name(名称) Value(値) 20130101      a      10 20130101      b      20 20130101      c      30 20130202      a      5 20130202      b      10 20130202      c      15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。

その他の回答 (2)

  • 回答No.2

推測ですが SELECT * FROM テーブルA WHERE (NO,DATE,GYO) < ( 3,TO_DATE('2010/12/02','YYYY/MM/DD'), 1) みたいな事をやりたいということでしたら、Oracleでは文法エラーになってしまいます。 (PostgreSQLだと出来るのですが) なんで (NO<3) or ( (NO=3) and (DATE<TO_DATE('2010/12/02','YYYY/MM/DD') ) or ( (NO=3) and (DATE=TO_DATE('2010/12/02','YYYY/MM/DD') and ( GYO<1 )) と書くしかないですね。 外していたらごめんなさい。

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

質問者からの補足

ご回答ありがとうございました。 ただ私の質問の仕方がまずくNoは実データとしては存在せずに データの並びとしてわかりやすいように記載していました。 実データとしてはDATE、GYOのみです。 申し訳ございません。 具体的な実データの中身は テーブルA DATE(10桁) GYO(3桁) 2010/12/01 1 2010/12/01 2 2010/12/01 3 2010/12/02 1 <= 2010/12/03 1 2010/12/03 2 現在は、 select * from テーブルA where (SAGYODAY <= '2010/12/02') order by DATE DEC ,GYO DEC にて 一旦、範囲を日付だけでデータ取得し、プログラム内部で DATEとGYOを結合し(GYOは3桁0埋め変換) 2010/12/02001 <= 2010/12/01003 2010/12/01002 2010/12/01001 <=のデータより小さいデータを対象として処理を行っています。 この処理を行うのではなく、SQLだけでデータ取得できないかと思っております。 申し訳ございませんが、よろしくお願い致します。

  • 回答No.1
  • kouta77
  • ベストアンサー率20% (185/896)

このテーブルのデータだけを考えると Where no < 変数.NO だけでないでしょうか?

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

質問者からの補足

ご回答ありがとうございました。 ただ私の質問の仕方がまずくNoは実データとしては存在せずに データの並びとしてわかりやすいように記載していました。 実データとしてはDATE、GYOのみです。 申し訳ございません。 具体的な実データの中身は テーブルA DATE(10桁) GYO(3桁) 2010/12/01 1 2010/12/01 2 2010/12/01 3 2010/12/02 1 <= 2010/12/03 1 2010/12/03 2 現在は、 select * from テーブルA where (SAGYODAY <= '2010/12/02') order by DATE DEC ,GYO DEC にて 一旦、範囲を日付だけでデータ取得し、プログラム内部で DATEとGYOを結合し(GYOは3桁0埋め変換) 2010/12/02001 <= 2010/12/01003 2010/12/01002 2010/12/01001 <=のデータより小さいデータを対象として処理を行っています。 この処理を行うのではなく、SQLだけでデータ取得できないかと思っております。 申し訳ございませんが、よろしくお願い致します。

関連するQ&A

  • 変数を使ってのSQL文の書き方(ASP)

    プログラム未経験者です。 aspのSQL文の書き方を教えてください。 (ASP.NETではなく、ASPの方です。) FORMで受けっ取った日付データをstrdayという変数に代入し、 そのstardayを使ってのSQL文の書き方ですが、 以下のような書き方で良いのか分かりません。 例えば、 前の行の「SQL」という同じ変数の直後に連結する書き方や 文字列との連結の書き方です。 また日付をシングルクオーテーションで囲む書き方などです。 strday = Request.Form("StartDay") SQL = "SELECT ・・・,・・・," SQL = SQL & strday & "as startday_date, ・・・," SQL = SQL & " WHERE ('" & strday & "' >= CONVERT(DATETIME, '2012-07-05 00:00:00', 102)) " SQL = SQL & " AND ('" & endday & "' <= CONVERT(DATETIME, '2012-07-06 00:00:00', 102)) " すみません。 宜しくお願いします。

  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE

  • SQLの書き方がわかりません

    下記テーブルが access上にあります。 t1 ID 日付 01 2011/8/1 01 2011/9/1 02 2011/3/1 03 2011/5/30 t2 ID 日付 01 2011/7/1 01 2011/7/30 01 2011/8/1 01 2011/8/2 01 2011/9/2 02 2011/2/11 02 2011/3/1 02 2011/8/1 03 2011/4/30 03 2011/5/29 03 2011/6/30 このデータからt1を元に ID 日付1 日付2 01 2011/8/1 2011/8/1 01 2011/9/1 2011/8/2 02 2011/3/1 2011/3/1 03 2011/5/30 2011/5/29 というデータを取得するにはどのようなSQLを書けばよいでしょうか。 具体的にはt1とt2のIDが同じで、 t2の日付がt1の日付以下で最大のレコードと紐付けたいのです。

  • SQLで、指定日条件のSQL文

    MySQLを使っています。 商品テーブルの中で、 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、 1)商品IDで重複せずに、2)指定日に、3)一番近い過去の日、4)指定日を含めて、複数ある未来の全レコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 商品でユニークになるように、 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.未来に複数ある日付の中の、全ての未来の、レコード。 3.同一商品レコードは、複数抽出されない。

  • SQLの書き方について

    以下の様なデータある場合 【Aテーブル】 ------------- NO,ITEM, KOSU ------------- 1 ,001 , 1 2 ,002 , 3 3 ,003 , 1 【Bテーブル】 ------------------- NO,NENDO,CODE,BIKO ------------------- 1,2006 , 1 , 1111 1,2007 , 0 , 1111 1,2007 , 2 , 1111 2,2007 , 0 , 2222 3,2007 , 0 , 3333 3,2007 , 1 , 3333 ------------------------------ NO,NENDO,CODE,BIKO,ITEM,KOSU ------------------------------ 1,2007 , 0 , 1111,001 , 1 2,2007 , 0 , 2222,002 , 3 3,2007 , 0 , 3333,003 , 1 と出力。(キーはNo) NO毎のかつ年度の降順、コードの昇順で最新の1件を 取得するにはどのようなSQLを作成したらよいのでしょうか?

  • SQL文について

    OracleやSQLについてはまだ初心者のレベルで理解が浅いので言葉足らずかもしれませんがよろしくお願いします。 以下のようなテーブル(名称:TBL)があったとします。 SHOP_CODE------SHOP_NUMBER----MONEY1------MONEY2 A ---------------- 1 ---------------- 100 ------------- 200 B ---------------- 2 ---------------- 300 ------------- 400 C ---------------- 3 ---------------- 500 ------------- 600 D ---------------- 4 ---------------- 700 ------------- 800 例えば、SHOP_CODEがA~Dのどれかの行(レコード)はそのまま抽出して、残った行(レコード)はMONEY1およびMONEY2を0に変更して抽出しようとした場合、 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入' UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> 'A~Dのどれかを代入' このようなSQL文を考えてみました。 しかし、比較的簡単な例ならばよいのですが、UNION前のSELECT文が複雑になってきた場合のことを考え以下のような文の作りかたができないかと思いました。 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入'・・・『この時点で抽出した塊になんらかの名称をつける(例:tbl)』 UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> tbl.SHOP_CODE・・・『このようにUNION以前に抽出した塊の名称を利用して条件を作成』 このような方法ができるとした場合、前段階で抽出した塊にどのような方法で名称をつけるのか分かりませんでした。(汗)そもそもできるかどうかもわかりませんが、、、(^^; 最初のSQL文がベターな方法なのかも分かりませんが、上記に示した方法で抽出することが可能でしょうか?もしできるのならば、前述したように名称をつけて条件を作成する方法等を教えていただきたいと思います。 おおよそ話を分かっていただければよいのですが、ものすごく簡単に言うと一つのテーブルのある行とある行に別々の処理をして再構成したいというようなイメージです。(今回はMONEYを0にすると仮定しました) できれば上記の方法に沿った考えで回答をいただけると私も助かりますが、もっと良い方法があれば是非伺いたいと思います。お時間の方ありましたらよろしくお願いします。

  • SQL文のCOUNTの戻り値は?

    はじめてSQLで関数を使用するのですが、テーブルの行数を知る COUNT関数で戻り値をどのように取得するのでしょうか? VBの変数に代入したいのですが・・・ 調べては見たのですがサンプルのプログラムなどが見つかりませんでした。 よろしくお願いします。 ADOを使用しています。

  • GROUP化した時の最適なSQL文の書き方

    いつも勉強させて頂いています。 GROUP化した時に応答時間がかかるので、 短縮したいのですが、方法をご教示願います。 SQLSERVER2005 EXPRESS VB2008 テーブルA(注文NO、手配日付、品名、手配数) テーブルB(入荷NO、注文NO、入荷数、単価) テーブルAの注文NOに対して複数の入荷があります。 テーブルAの注文NOに対して未入荷の場合も「0」で出力します。 出力(注文NO、品名、入荷累計、平均単価、合計金額) SQL文を書く時に、注文NOでGROUP化してから抽出(手配日付)すると レコード件数が多いため、応答時間がかかってしまいます。 どのような書き方がよろしいでしょうか? この書き方では、時間がかかります。 SELECT テーブルA.注文NO, テーブルA.手配日付, テーブルA.品名, テーブルB2.入荷数, テーブルB2.単価 FROM テーブルA LEFT OUTER JOIN (SELECT 注文No, SUM(入荷数) AS 入荷数, AVG(単価) AS 単価 FROM テーブルB GROUP BY 注文No) AS テーブルB2 ON テーブルA.注文NO = テーブルB2.注文No WHERE (テーブルA.手配日付 = '2008/01/01') すべてのレコードをグループ化してから処理しているため、遅いと思います。 よろしくお願いいたします。

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。

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

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16