• ベストアンサー

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

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.5

結果を見ると、結合の方は成功しているので、WHERE選択条件が間違っていますね。 ということは、#1で書いた 3)BがNULLであるか、日付がX以前であるようにWhereを記述 4)CがNULLであるか、日付がX以前であるようにWhereを記述 でやっぱりNULLであるかの判定をしなきゃいけないようです。(SQLしばらくさわっていないため錆付いています) WHERE (table_A.DATE <= 日付X) AND ((table_B.DATE IS NULL) OR (table_B.DATE <= 日付X )) AND ((table_C.DATE IS NULL) OR (table_C.DATE <= 日付X )) では多分OKでしょう。 PostgreSQLの仕様はわかりませんが、 table_B(C).DATE IS NULL の部分が table_B(C).DATE = NULL になるかも知れません。

BottleCap
質問者

お礼

おかげさまで、思い通りの結果が出ました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • yomo3
  • ベストアンサー率32% (88/269)
回答No.7

#6ざんす。 日付の指定を3つともしなければならないのならば、 WHERE ((table_A.DATE<=日付X) AND (table_B.DATE<=日付X Or table_B.DATE Is Null) AND (table_C.DATE<=[日付X] Or table_C.DATE Is Null); みたいに、Nullも加えないと、拾ってくれないように思います。

全文を見る
すると、全ての回答が全文表示されます。
  • yomo3
  • ベストアンサー率32% (88/269)
回答No.6

これじゃあ、だめかなぁ…… SELECT table_A.ID, table_A.DATE AS table_A_DATE, table_B.DATE AS table_B_DATE, table_C.DATE AS table_C_DATE FROM (table_A LEFT JOIN table_B ON table_A.ID = table_B.ID) LEFT JOIN table_C ON table_A.ID = table_C.ID WHERE ((table_A.DATE)<=日付X);

全文を見る
すると、全ての回答が全文表示されます。
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.4

FROM内のLEFT JOIN結合に、ON結合条件式を見事に書き落としていました。またまた、ボケてました。 結合できるわけありません、失礼しました。 1) FROM [table_A] LEFT JOIN ([table_B] LEFT JOIN [table_C] ON table_B.ID = table_C.ID) ON table_A.ID = table_B.ID 2) FROM ([table_A] LEFT JOIN [table_B] ON table_A.ID = table_B.ID) LEFT JOIN [table_C] ON table_A.ID = table_C.ID 1)は下のFROMに結合条件を入れたものです。 A+(B+C) 2)の書き方の方が、結合式と結合条件式が隣接するためわかりやすいかな、と思い書き直しました。 (A+B)+C 全文を書くとこうなります SELECT table_A.ID, table_A.Date table_A_DATE, table_B.Date table_B_DATE, table_C.Date table_C_DATE FROM ([table_A] LEFT JOIN [table_B] ON table_A.ID = table_B.ID) LEFT JOIN [table_C] ON table_A.ID = table_C.ID WHERE (table_A.DATE <= 日付X) AND (table_B.DATE <= 日付X ) AND (table_C.DATE <= 日付X )

BottleCap
質問者

補足

何度もありがとうございます。 実行してみましたが 残念ながら結果は以下のようになりダメでした。 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 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ なし

全文を見る
すると、全ての回答が全文表示されます。
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

#1です PostgreSQLは使用したことがないですが、下記リンクのページを参考に書くとこうなります。 SELECT table_A.ID, table_A.Date table_A_DATE, table_B.Date table_B_DATE, table_C.Date table_C_DATE FROM [table_A] LEFT JOIN ([table_B] LEFT JOIN [table_C]) WHERE (table_A.DATE <= 日付X) AND (table_B.DATE <= 日付X ) AND (table_C.DATE <= 日付X ) 下では、『B(C)がNULLであるか、』などとボケたことを書いていますね、その部分忘れてください。

参考URL:
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k08.htm
BottleCap
質問者

補足

上のSQLでうまく動かなかったので 下のようになおして動かしてみました。 ですが、思うような結果は得られませんでした。 考えれば考えるほど なんか実現できないような気がしてきました・・。 SELECT table_A.ID, table_A.Date as table_A_DATE, table_B.Date as table_B_DATE, table_C.Date as table_C_DATE FROM ( [table_A] LEFT JOIN [table_B] ON table_A.DATE <= 日付X AND table_B.DATE <= 日付X ) LEFT JOIN [table_C] ON table_C.DATE <= 日付X

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

おつかれさまです Oracleならこんな感じかな? でも、実行してませんので直してくださいね。 Select tableA.ID, tableA.DATE as table_A_DATE, tableB.DATE as table_B_DATE, tableC.DATE as table_C_DATE From tableA,tableB,tableC Where tableA.ID = tableB.ID(+) And tableA.ID = tableC.ID(+) And tableA.DATE <= 日付X And tableB.DATE <= 日付X And tableC.DATE <= 日付X

BottleCap
質問者

補足

残念ながらオラクルではなくて こちらはPostgreSQLなんです。 (+)が使えないですが参考にさせて頂きます。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

外部結合で実現できると思われます。 ただし、外部結合はSQLの方言のきつい部分なので、データベースサーバがなにか判らないため、そのものずばりを記述するのは、割愛しなきゃ仕方ないですね。 1)A,B,Cそれぞれを、ID番号で外部結合して一つのテーブルのように扱えるようにする 2)Aの日付がX以前であるようにWhereを記述 3)BがNULLであるか、日付がX以前であるようにWhereを記述 4)CがNULLであるか、日付がX以前であるようにWhereを記述 のステップで実行されていけばとりあえず良いかと思います。件数やDBサーバのスペック、接続方法などによっては、チューニングが必要です。 データを並べるだけより、どのような結果を取得したいのかを文章で書いたほうが、回答が得られると思います。 また、記述された例では、当日を含むか含まないかが判りません。実装する際にはそのあたりに気をつけた方が良いと思われます。

参考URL:
http://www.atmarkit.co.jp/fnetwork/rensai/sql06/sql1.html
BottleCap
質問者

補足

回答ありがとうございます。 こちらの使用しているものはPostgreSQLです。 >また、記述された例では、当日を含むか含まないかが判りません。実装する際にはそのあたりに気をつけた方が良いと思われます。 とりあえず、どんな感じのSQLになるのか 知りたくてざっと質問を作ってしまったため 内容がアバウトになっていました・・。 申し訳ないです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL文でテーブルを作りたいのですが・・・

    テーブルを作りたいのですが、思い描くテーブルが作れず、困っています・・・ 例えばMさんがA→B→C→Dと旅行に行ったとします。 そのとき、行った場所によって日付が登録されるようにしたいと思っています。 このように、別な人もいろいろと旅行し、それぞれの日付があり、どんどんと格納していきます。 最初に ID id 日付 date 場所 point (名前はとりあえず、IDとします) でテーブルを作ろうとしましたが、これだとID一つにつき、日付と場所も一つずつしか入りませんよね? どういったテーブルを作ればいいでしょうか? 思い描くテーブルは下記のような感じです。 ID     日付      場所 -------------- 1  |2010/10/06 |  A   |2010/10/14 |  B   |2010/10/20 |  C   |2010/10/25 |  D -------------------------- 2  |2010/10/23 |  B    |2010/10/24 |  A    |2010/10/25 |  D    |2010/10/27 |  C -------------------------- 3  |2010/10/25 |  D    |2010/10/27 |  C    |2010/11/03 |  B    |2010/11/04 |  A    |2010/11/07 |  D    |2010/11/10 |  C ------------------------- 4  |2010/11/10 | B    |2010/11/15 |  A    |2010/11/16 |  D ・・・・・・・・・・・・・・・ このように一つのIDに対して、日付と場所がランダムの数で格納したいのですが、これって可能でしょうか? テーブルを2つ(以上)作り、外部キーを使ってもかまいません。 また、足りなければ違うIDなどでカバーしてもかまいません。 実際は、このようなテーブルを作り、一人毎の動線を調べるために活用したいと思っています。 Mさん:今日はAに行って、明日はBに行き、明後日はCに行った。すなわち動線は・・・のような感じです。 SQL文でテーブルを作ってください。 補足事項等ありましたらご指摘下さい。追加いたします。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • mysqlのsql文について教えて下さい

    mysqlのsql文について教えて下さい 下記のようなテーブルとデータがあった場合に どうやれば 2,次郎だけを抽出できますか? 本日日付(2010-08-06)が 既にテーブルBにdateが存在する場合は 3,1,2010-08-04 3,1,2010-08-06を 対象外にしたいです。 Aテーブル id,user 1,太郎 2,次郎 3,3郎 Bテーブル targetid,homonid,date(datetime型) 3,1,2010-08-04 3,1,2010-08-06 3,2,2010-08-05 下記だと2010-08-04にヒットしてしまい(当たり前?)動作しません。 select distinct a.* from tblA a, tblB b where date_format(b.date, "%Y-%m-%d") <> "2010-08-06" ;

  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • 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文を教えてください。よろしくお願いします。

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • JOINを使ったSQL文を作成しようとしています。

    JOINを使ったSQL文を作成しようとしています。 以下の様な3つのテーブルがある場合のSQL文を教えて下さい ※勉強の為、適当なテーブルを作成しましたが、やりたい事は  JOINの中に更にJOINさせたSQL文を作成したいと思ってます 表A  USER_ID(プライマリキー)  NAME 表B  USER_ID(プライマリキー) ※表A.USER_IDと紐着く  BUMON(プライマリキー)  TERM(プライマリキー) 表C  BUMON(プライマリキー) ※表B.BUMONと紐着く  TERM(プライマリキー) ※表B.TERMと紐着く  MEMBER 【取得したい項目】  表A.USER_ID 【抽出条件】  表CのMEMBERの値が'10','20'以外(である表AのNAMEを取得)

  • SQLを教えて下さい

    SQL文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)

  • 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文になるでしょうか。 よろしくお願いします。

  • 【SQL文】Insert into文で文法エラー

    insert into文で思ったような結果がでません。SQL文にお詳しい方、ご教授いただけますでしょうか? SQLは初心者レベルです。 期待している結果: テーブルT-BBSにT-USRのusr-id全リストを入れて、T-BBSのa,b,cには固定の数値を入れたいと思っています。 テーブル例: テーブル名:T-BBS ,カラム:usr-id,a,b,c, テーブル名:T-USR, カラム:usr-id 結果 user-id | a | b | c 2 |1 | 2 | 3 3 |1 | 2 | 3 4 |1 | 2 | 3 7 |1 | 2 | 3 私が考えたSQL文ですが、 INSERT INTO T-BBS(SELECT user-id FROM T-USR,1,2,3) →×(文法エラー) INSERT INTO T-BBS(user-id,a,b,c) VALUES (SELECT user-id FROM T-USR,1,2,3)→× 文法エラー INSERT INTO T-BBS(user-id,a,b,c) VALUES ((SELECT user-id FROM T-USR),1,2,3)→×サブクエリが複数行を含んでいる ちなみにデータベースはH2 Databaseというものみたいですが、mySQLと方言は同じという認識をもってます。 以上宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの質問です。

    SQLの質問です。 SQL Server 2008 R2 を使っている初心者です。 下の2つのテーブルがあります。 1)売上情報 table_uriage ・uriage_id ・user_id ・uriage_date ・uriage_kingaku 2)入金情報 table_nyukin ・nyukin_id ・user_id ・nyukin_date ・nyukin_kingaku この2つのテーブルに対して、同じ期間を指定して、集計表(ユーザー毎の合計)を 作りたいと思っています。別々の表にするには何の問題もないのですが、 問題は2つのSQLの結果を1つの表にしたいのですが、SQLをどのように組んだらいいか わかりません。 具体的な表としては、 user_id uriage_total nyukin_total ======================================== 001 11111 22222 002 33333 44444 003 55555 66666 みたいな感じになればいいのです。 どなたか教えて下さい。 よろしくお願いいたします。

このQ&Aのポイント
  • NECのLavieを使用しているが、電源ボタンを押しても再起動画面になる
  • Windows 7からWindows 10に変更後、パソコンの調子が悪くなった
  • NEC 121wareのWindowsに関する質問
回答を見る