• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL文のとり方を教えてください。)

SQL文のとり方を教えてください

このQ&Aのポイント
  • 以前同内容で質問させていただきましたが、再度依頼させていただきたく投稿しました。
  • 1件の依頼No.にぶらさがる配送先が3か所あります。この中で一番新しい(=若い)日付の配送日&到着日をとりたいです。
  • 配送日と到着日はワンセットと考えて、新しい日付の配送日がとれたら、自動的に隣の到着日もとれるイメージです。(例でいけば上から2つ目の配送日:20110106 到着日:20110107)どういう風にSQL文を書いたらいいかわかりません。どなたか教えて頂けませんか?

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

SQLを考える時には理論を考えないと いけません。それと、質問が曖昧です。 >この中で一番新しい(=若い)日付の 日付は二つあるんですよね? 配送日なのか到着日なのかハッキリ しません。配送日が早くても、到着日が 遅い場合もあるのでは? 「新しい」と言いますが、2行目は一番 古いですよ。 ここでは「古い配送日」と仮定します。 (1)テーブルBから依頼No毎に、一番  日付の古い(小さい)ものを抽出する。 (2)上記クエリとテーブルBを依頼Noと  最も古い日付と結合させ、依頼Noと  枝番を抽出する。 (3)上記のクエリと依頼No、枝番が一致  するデータを抽出する。 これを表わすと以下のようになる。 SELECT A.* FROM テーブルB A INNER JOIN (SELECT B.依頼No,B.枝番 FROM テーブルB B INNER JOIN (SELECT D.依頼No,MIN(D.配送日) 過去日 FROM テーブルB D GROUP BY D.依頼No) C ON B.依頼No=C.依頼No AND B.配送日=C.過去日) E ON A.依頼No=E.依頼No AND A.枝番=E.枝番 ちょっと分かり難いので説明します。 2番目のサブクエリ"(SELECT D.依頼No~) C" この部分が(1)にあたります。このカッコの 内側は依頼No毎に最過去日を取っています。 1番目のサブクエリ"(SELECT B.依頼No~) E" ここは最初のクエリ(Cというエイリアス)と 依頼No、日付が一致するクエリで(2)にあたり ます。 最も外側の"SELECT A.*~"が目的の結果を 得るためのものです。 外国語なんでね、日本人の考えと逆順になる ところがイヤですね。

masatt0027
質問者

お礼

ご丁寧な説明に感謝致します。 無事作成できました。有難うございました。

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

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

テーブルAは使う必要があるのでしょうか? 欲しいデータはテーブルBだけでも事足りますよね。 http://okwave.jp/qa/q6431441.html の回答で問題ないと思うのですが・・ ちなみに上記の回答の「table名」の箇所には今回の質問でいう<テーブルB>が入ります。 a、b とあるのは、ただのエイリアスだということは分かってらっしゃいますか?

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

関連するQ&A

  • SQLのとり方を知りたいです。

    下記図を参照願います。 1件の依頼No.にぶらさがる配送先が3か所あります。 この中で一番新しい(=若い)日付の 配送日&到着日をとりたいです。 配送日と到着日はワンセットと考えて、 新しい日付の配送日がとれたら、自動的に隣の到着日もとれるイメージです。 (例でいけば上から2つ目の配送日:20110106 到着日:20110107) どういう風にSQL文を書いたらいいかわかりません。 どなたか教えて頂けませんか? 依頼No.  枝番     配送日  到着日 1111     1      20110107   20110108 1111     2      20110106   20110107 1111     3      20110108   20110109

  • SQLサーバー2000でのSQL文の質問です。

    開発環境はSQLサーバー2000です。 下記のような親子関係のテーブルがあった場合に、【結果】のような結果を得れるようなSQL文を教えていただきたいです。 【親】 -------------------------------- |品番 |品名 -------------------------------- |1 |ラーメン -------------------------------- |2 |カレー -------------------------------- |3 |うどん -------------------------------- 【子供】 -------------------------------- |品番 |枝番 |食べた日 -------------------------------- |1 |1 |1/1 -------------------------------- |1 |2 |1/2 -------------------------------- |3 |1 |1/3 -------------------------------- |3 |2 |1/4 -------------------------------- |3 |3 |1/5 -------------------------------- |3 |4 |1/6 -------------------------------- 【結果】 親子テーブルを連結したSQLを実行すると -------------------------------- |品番 |品名 |食べた回数 -------------------------------- |1 |ラーメン|2 -------------------------------- |2 |カレー |0 -------------------------------- |3 |うどん |4 -------------------------------- のような結果が帰ってくるSQLが作成可能でしたらご教授いただけますようよろしくお願い致します。

  • 簡単なSQLに関して

    初歩的なSQLの質問で申し訳ありません。 教えて下さい。 下記のような、ある2つの異なる名前の同項目のテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容 Bテーブル  社員番号、日付、内容  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 どのようなSQLを書けば良いでしょうか?? 尚、テーブルに関しては、諸事情であえて2つに分けてあります。 よろしくお願いします。

  • SQL Server テーブル設計で悩んでいます。

    SQL Server 2008 R2 Visual Studio 2008 テーブルの設計で悩んでいます。 テーブルAのようなデータがあり、実際には、場所のNo.の数は500点くらいあります。 このデータをSQL to LINQでデータの追加、参照をしたいと思っています。 テーブルA,B、どちらの形式で設計する方がよいのでしょうか。 テーブルAの場合は、見た目がそのままで分かりやすいのですが、データ追加時(INSERT)に多数のデータを 追加する方法が分かりません。 テーブルBの場合は、テーブルAの形式で取得する場合、どうすればよいのか分かりません。 ここから先に進めず困っております。よろしくお願いします。 テーブルA 日付 No.1 No.2 No.3 No.4 No.5 2011/1/1 0 68 37 41 38 2011/1/2 3 60 3 69 46 2011/1/3 22 89 63 14 77 2011/1/4 75 8 55 46 41 2011/1/5 63 92 1 26 90 2011/1/6 61 23 77 42 93 2011/1/7 54 52 36 44 41 2011/1/8 72 98 30 66 48 2011/1/9 20 3 89 15 59 テーブルB 日付 場所 線量 2011/1/1 No.1 0 2011/1/1 No.2 68 2011/1/1 No.3 37 2011/1/1 No.4 41 2011/1/1 No.5 38 2011/1/2 No.1 3 2011/1/2 No.2 60 2011/1/2 No.3 3 2011/1/2 No.4 69 2011/1/2 No.5 46

  • ORACLEで2つのテーブルを同時にUPDATE

    テーブルA  伝票No.  発送日  到着日(6桁) テーブルB  伝票No.  送り先  到着日(4桁) というテーブルがあるとします。 伝票No.が同じデータで、かつ、発送日がシステム日付の場合に 2つのテーブルの到着日を翌日にするには どのようなSQL文を書けばいいのでしょうか? よろしくお願いいたします。

  • SQL 集計について

    集計方法がどうしてもわからないのでご教授ください。 下記のテーブルを持っています。 テーブル1では日々の売上金額を管理し、 テーブル2では一週間の日付が保存されています。(月曜日~日曜日) -------テーブル1-------           日付    売上金額   2013/09/01     3000   2013/09/02     4000   2013/09/03     2000    ・              ・           ・           2013/09/30     1000 ----------------------- --------テーブル2---------  日付(月)    日付(日)    2013/08/26   2013/09/01 2013/09/02   2013/09/08    ・        ・    ・       2013/09/30   2013/10/06 ------------------------- テーブル1とテーブル2の情報をもとに テーブル3にある、日付(月)と日付(日)は、テーブル2から持ってきて、 一週間の集計を行いたいと思っております。 --------------テーブル3--------------  日付(月)    日付(日)    売上金額 2013/08/26  2013/09/01     3000 2013/09/02  2013/09/08     6000   ・   ・   ・ 2013/09/30  2013/10/06     1000 ------------------------------------ このようにするにはどのようなSQLを組めばいいのでしょうか? SQL初心者のため、難しい単語などを使わずに ご説明をしていただければと思います。 どうぞ、よろしくお願いいたします。

  • 凝ったSQL文なのですが・・・

    下記SQLを教えてください。 テーブル構成は(基本的には)変更不可という前提でお願いいたします。 以下のような会員テーブルがあります。 ユーザID毎に、入会日、退会予定日が登録されており、 ユーザID+履歴No.でプライマリとします。 このテーブルは、月に一度、退会手続きのなかった会員に対して、 自動で新規レコード追加します(継続手続)。 ある期間休んだ後、再入会の場合も手動で新規レコード追加されます。 ステータスは有効(1)/無効(0)の判定です。 no user_id start_day end_day status ---------------------------------------- 1 aaa 2002/12/01 2002/12/31 0 2 aaa 2003/01/01 2003/01/31 0 3 bbb 2003/01/01 2003/01/31 0 4 aaa 2003/02/01 2003/02/28 1 5 bbb 2003/02/02 2003/02/28 1 6 ccc 2003/02/01 2003/02/28 1 とデータが入っている場合に、 新規登録ユーザ(No.6)および 再入会ユーザ(No.5)をえらびたいのです。 あるユーザが自動継続かどうかの判定は、 status=1のレコードのend_dayと そのひとつ古いレコードのend_dayが連続していることです。 よろしくお願いいたします。

  • SQLが分かりません

    SQLの初心者です。 ACCESSで売上げ管理をしようと考えています。 売上げに関するテーブルは以下のようになっています。 ●売上げヘッダ テーブル   伝票番号(キー)   売上日   売上げ金額    : ●売上げ明細 テーブル   伝票番号(キー)   枝番(キー)   商品コード   商品名   単価   数量   値引金額    : 値引金額は商品ごとに決まり、値引きしなければ0が、値引きがあればその金額が入ります。 売上げ一覧を表示する時に、以下のようなイメージで、 ワークテーブルを作って、値引きがあれば「あり」と画面に表示させたいのです。 ※無い時は何も表示させません 伝票番号  売上日  売上げ金額 値引き有無 9999 2004/1/1 10,000 10000 2004/1/2 1,500 あり 10001 2004/1/2 20,000 10002 2004/1/3 18,900 10003 2004/1/4 23,500 あり 1回のSQLで実行したいのですが、SQLには詳しくないので、 どのように書けばよいか分かりません。 よろしくお願いします。 値引き区分が無ければ、売上げヘッダを見るだけなのですが、 値引きがあるかどうかは、売上げ明細まで見なければいけないので、 SQLの書き方が分からないのと、以下のようなワークテーブルを 作る必要があると思うのですが、どうなのでしょうか。 ●ワーク テーブル   伝票番号   売上日   売上げ金額   値引き区分

  • 複雑なSQL文について

    SQLite バージョン3.7.10 を使用しています。 以下のサイトにソースがあります。 http://ideone.com/7FPtHL どう説明するのが適切なのかあまり分かりませんが、 よろしくお願い致します。 t5テーブルにおいて t2テーブルのt1_key1が't1_key_1' かつ t5テーブルのt3_keyに対応するt3テーブルのt1_keyに対応するt2テーブルのt1_key2の 例えば2012年1月の (t5テーブルのprofit × その日(t5テーブルのdateの日の部分)に対応した2テーブルのrate) を t4テーブルのkeyごとにグループ化してその合計値を高い順に出力したいのですが、 のですがどのようなSQL文を書けば良いのでしょうか? ※ ただし、もしt5テーブルのdateに対応する日付がt2テーブルのdateにない場合は、 t5テーブルのdateに対応する月(年も含めて)のt2テーブルのrateの平均値、 それもない場合は、t5テーブルのdateに対応する年のt2テーブルのrateの平均値、 それもない場合は、t5テーブルの全てのrateの平均値、 を取得してt5テーブルのprofitにかけたいのです。。 ※ 例えばこのデータなら 2012年1月は +----------+------+ | t4_name  | sum | +----------+------+ | t4_name_1 |500000| +----------+------+ | t4_name_2 |150000| +----------+------+ という結果が得たいです。 t5テーブルのdateの'2012-01-03 00:00:02'の日付に対応するt2テーブルのdateは存在しないので、 t2テーブルの1月(2012-01)のrateの平均値((100+200+300)/3=200)を profitにかけています。 複雑すぎるというか自分でもうまく説明できないので、 せめて※の部分のSQLの書き方だけでもアドバイス頂けないでしょうか?

  • SQLのUPDATE文に関して教えて下さい

    SQLのUPDATE文に関して教えて下さい まだまだ初心者で勉強中なのですが、ご教授をお願い致します。 2つのテーブルがあり同じ条件になったレコードのある項目を別のもう片方の項目にセットしたいのですが上手くいきません。 具体的には以下の通りです。 【テーブル1】 品番、 規格、 取引先、 日付 A1   XXX  T001   2010/01/01 A1   YYY  T002   (空白) B1   XXX  T001   (空白) C1   ZZZ  T003   (空白) 【テーブル2】 品番、 規格、 取引先、 受入日 A1   XXX  T001   2010/01/01 A1   YYY  T002   2010/03/01 B1   XXX  T001   (空白) テーブル1の「日付」が(空白)のレコードを対象に、 テーブル1の「品番+規格+取引先」とテーブル2の「品番+規格+取引先」が同じな場合、 テーブル1の「日付」項目にテーブル2の「日付」項目をUPDATEしたいと考えています。 結果を以下のようにしたいです。 【テーブル1】 品番、 規格、 取引先、 日付 A1   XXX  T001   2010/01/01 A1   YYY  T002   2010/03/01  ←ここが今回更新される B1   XXX  T001   (空白) C1   ZZZ  T003   (空白) 以前この場で教えて頂いたものを参考に以下のような感じで考えていたのですがエラーになります。 update テーブル1 set テーブル1.日付 = テーブル2.受入日 where テーブル1.日付 Is Null and (concat(concat(品番, 規格), 取引先)) in (select (concat(concat(品番, 規格), 取引先)) from テーブル2) ; ERROR at line 1: ORA-00904: "テーブル2"."受入日": invalid identifier set文のところの記述方法がわかりません。 宜しくお願い致します。