• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クエリで行と行のデータ比較方法を教えてください)

SQLクエリで行と行のデータ比較方法とは?

このQ&Aのポイント
  • SQLクエリで行と行のデータ比較方法を教えてください。SQL2005でクエリを走らせて調査したいので教えてください。
  • 取引データがあった場合、今回の取引開始日と前回の取引終了日を比較して3週間以内かどうかの調査をしたいです。クエリで一発で出す方法がないでしょうか?
  • 相関サブクエリを使って実現しようと思いましたが、構文が合っていないようでうまく実行できません。相関サブクエリの意味も理解できていません。助言をお願いします。

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

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

No.1です。 インラインビューには別名をつけないといけないということかもしれません。 select 企業 ,取引開始日 ,取引終了日 ,取引開始日 - 前回取引終了日 as 経過日 ,case when (取引開始日 - 前回取引終了日) > 21 then '○' else null end as "3週間以上" from (select 企業 ,取引開始日 ,取引終了日 ,(select max(取引終了日) from 取引データ B where b.企業 = a.企業 and b.取引終了日 < a.取引開始日) as 前回取引終了日 from 取引データ A) as 取引データ; などとして試してみてください。

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

その他の回答 (3)

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

SQLを考える場合は理論を組み立てないと、 「たまたまできた」に期待するしかなくなります。 【理論】 1、自レコードの取引開始日より小さい取引終了日を  持つデータ集合を作る。 2、上記データ集合中直近、つまり取引終了日の  最大値を求める。 3、自レコードの取引開始日とデータ集合の  取引終了日の最大値との差が経過日数である。 とりあえず3週間経過かどうかは別として、経過日数を 求めるSQLは次のようになるかと思います。 SELECT A.企業,A.取引開始日,A.取引終了日, CASE   WHEN Max(B.取引終了日) IS NULL THEN NULL   ELSE DATEDIFF(day,Max(B.取引終了日),A.取引開始日) END AS 経過日数 FROM 取引データ A LEFT OUTER JOIN 取引データ B ON A.企業=B.企業 AND A.取引開始日>B.取引終了日 GROUP BY A.企業,A.取引開始日,A.取引終了日 インデントに漢字空白を使っています。コピペしただけでは エラーになるので、漢字空白を半角にしてください。

juujuu2929
質問者

お礼

くわしい説明をありがとうございます。 A企業内での取引開始日と前回取引終了日を比較していき、経過日数を右へ出したいのですが、イマイチループ処理がわかっていませんでした。 クエリを走らせたのですが、思ったような数字がでませんでした。 一覧はそのままデータとして表示しておきたいのですが、穴空きになってしまいます。

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

確認できる環境が手元にないのでミスってるかもですが、 こんな感じでいけませんかね? select d1.企業, d1.取引開始日, d1.取引終了日, datediff(day, d1.取引開始日, d1.取引終了日) as ★経過日, case when select top 1 d2.取引終了日 from 取引データ as d2 where d1.企業 = d2.企業 and d1.取引開始日 > dateadd(week, 3, d2.取引終了日) is null then '' else '○' end as ★3週間以上 from 取引データ as d1 order by d1.企業, d1.取引開始日 サブクエリ部分はcountにして0件かどうかを判断してもいいですが、 たぶんこのほうがレスポンスはいいはず。

juujuu2929
質問者

お礼

早々にありがとうございました。 2点エラーが出ます。 メッセージ156 レベル15 状態1 キーワード'select'付近に不適切な構文があります select top 1 d2.取引終了日 from ・・・ このtop 1 ってのを top01() top1() にしてみましたが駄目でした。 メッセージ156 レベル15 状態1 キーワード'is'付近に不適切な構文があります。 is null then '' else '○' ここに問題ありでしょうか・・・。

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

サブクエリで前回の取引終了日を取得して比較すればいいのではないでしょうか。 たとえばこんな感じで。 select 企業 ,取引開始日 ,取引終了日 ,取引開始日 - 前回取引終了日 as 経過日 ,case when (取引開始日 - 前回取引終了日) > 21 then '○' else null end as "3週間以上" from (select 企業 ,取引開始日 ,取引終了日 ,(select max(取引終了日) from 取引データ B where b.企業 = a.企業 and b.取引終了日 < a.取引開始日) as 前回取引終了日 from 取引データ A); 動作確認はしていません・・・

juujuu2929
質問者

お礼

早々にありがとうございました。 ところが、最終行のところで from 取引データ A); でエラーが出ます。 メッセージ102 レベル15 状態1 ')'付近に不適切な構文があります。 となってしまいます。

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

関連するQ&A

  • ACCESS 比較後の抽出

    テーブル1 a_b テーブル2 c_d クエリ1 a&b:[a]+[b] c&d:[c]+[d] クエリでiif([a&b]=[c&d],"○","×") としたとき抽出条件に○としてもパラメータクエリが出てしまいます。 サブクエリを使うのでしょうが今一使い方が分かりません。 ご教授お願いします。

  • ACCESSクエリー処理で

    ACCESS2000でのクエリー処理において下記方法を教えてください。 テーブルA   商品A 開始日 終了日   商品A 開始日 終了日   商品B 開始日 終了日   ※商品単位に開始日や終了日が違うレコードが複数存在します。 上記テーブルをクエリーで下記イメージに処理できますでしょうか?   商品A 開始日 終了日 開始日 終了日   商品B 開始日 終了日   

  • Access クエリのデータ型について

    AccessでPablic変数を日付範囲指定、クエリの抽出条件に指定したのですが、「抽出条件でデータ型が一致しません。」とのエラーメッセージで抽出出来ません。 【処理フロー】 1.フォームで、開始日と終了日をPublic変数へ格納 2.データ抽出クエリの日付条件に"GetData()"Public Functin VBAで変数を格納した値をクエリの抽出条件に返す。 《変数》 '開始日の宣言 Public sDate As Date '終了日の宣言 Public eDate As Date 《GetData()》 Public Function GetDate() MsgBox "開始日は、" & sDate & vbCrLf & "終了日は、" & eDate GetDate = ">=#" & sDate & "# And <=#" & eDate & "#" MsgBox ("Where文は、" & GetDate) End Function デバッグの為、"GetDate()"の戻り値を、メッセージボックスで表示してますが、戻り値は正常とおもわれますが、「抽出条件でデータ型が一致しません。」でクエリが実行できません。 ここを参考に、上記仕様にしました。 http://www.tsware.jp/tips/tips_369.htm どうすれば、日付範囲をPablic変数から指定出来るか、お教え頂けましたら幸いです。 ちなみに、Pablic変数にしているのは、他のクエリでもこの日付範囲を使いたい為です。 もし、ほかに良い処理方法が有れば、ご教授ください。

  • アクセス クロス集計クエリ 縦の合計

    テーブル1には 会社名 取引日 金額 A社 2014/01/01 ¥100 B社 2014/01/02 ¥200 A社 2015/01/01 ¥500 というデータがあります。 このテーブル1を基にクロス集計クエリで TRANSFORM Sum([テーブル1].[金額]) AS 金額の合計 SELECT [テーブル1].[会社名], Sum([テーブル1].[金額]) AS [合計 金額] FROM テーブル1 GROUP BY [テーブル1].[会社名] PIVOT Format([取引日],"yyyy"); というクエリを自動生成しました。 この時、横の合計ではなく縦の合計(年ごとの合計)を表示するには良いでしょうか? サブクエリというのを使うようですが、どうすればいいかわかりませn。 よろしくお願いします。

  • 2表を比較して新規データの作成について

    すみません。以下のような要件をSQLで実行が可能であるか教えて頂ければ助かるのですが。。なかなかこのようなサンプルが載っているものを探しだせなくて今回ご質問させて頂いた次第です。 環境はOracle10gです。 ■A表 会社コード 社員コード 開始日  終了日  業務区分 ------------------------------------------------------ 0001    0001    20010101 20080331 1 0001    0001    20080401 20081231 2 0001    0002    20010101 20080331 1 0001    0002    20080401 20081231 2 ■B表 会社コード 社員コード 開始日  終了日  業務区分 ------------------------------------------------------ 0001    0001    20010101 20080331 3 0001    0001    20080401 20081231 4 0001    0002    20010101 20080331 1 同一の会社コードと社員コードでA表とB表を比較してB表の終了日(直近)の翌日がA表の開始日にデータが存在しない場合に、A表にB表の終了日の翌日を開始日として新たにA表にデータを追加するのにSQLで実現させたいのですが。 追加されるデータのイメージは以下になります。 ■A表(新規追加) 会社コード 社員コード 開始日  終了日  業務区分 ------------------------------------------------------ 0001    0001    20090101 20091231 4 また、そのあと追加したデータの1つ前の暦日について、業務区分を0で更新させたい場合についてもご教授頂ければ助かります。 ■A表(更新) 会社コード 社員コード 開始日  終了日  業務区分 ------------------------------------------------------ 0001    0001    20080401 20081231 0 長々となりましてすみませんがよろしくお願い致します。

  • 複雑なクエリの自己結合について

    はじめまして、SQLもMYSQLも初心者です。 独学で、1,2か月といったところでしょうか MYSQL5.5.を使用しています。 早速ですが質問です。 自己結合のもとになるクエリが複雑?な場合どうすれば負荷の少ないクエリが組めるでしょうか? 自己結合したいクエリが、相関サブクエリをつかっているためViewが作れないので 素人考えで、もととなるクエリをSQL中に何回も記述してみましたが、 メモリがオーバーフローしてしまいます。 複雑なクエリをスマートに自己結合する方法はないのでしょうか? それとも、そもそも、最初に自己結合や外部結合でめいいっぱいデータを展開し、それを相関サブクエリ.etcで、漸次、絞り込んでいくほうが、SQLの手段としては正しいのでしょうか? 他で上記のクエリのかなりの部分を使用するので、再利用できないかと思って組んでみましたが 行き詰まり、色々と自信がなくなってきました、アドバイスをお願いします。 以下やりたいことです 暇だったら見てください。 勉強も兼ね、カレンダーアプリで担当者ごとの抱えているプロジェクトと、忙しさ、割ける時間、効率性 を可視化することを目的としたソフトをつくろうと思っています。そこで、日にちごとに、不特定の時間帯から、時間の重複を許して、複数の時間帯を除した、あまりの時間を求めるクエリを組もうと思い、web上で勉強して、相関サブクエリと、自己結合とHAVING文などを組み合わせれば、実現可能なことがわかりました。そこで、相関図を書いて、実際に作って見たのですが、上記のようになった次第です。ぜひ、皆様のお知恵を拝借したいしだいです。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ACCESSのクエリで表示されるデータについて

    クエリで表示されるデータの範囲について教えてください。 <状況例> 例えばなのですが、取引先会社の管理データベースとして「テーブルA」と「テーブルB」があったとします。 「テーブルA]のフィールドは「会社ID」、「会社名」、「住所」とします。 「テーブルB]のフィールドは「連絡先ID」、「会社ID」、「担当者名」とします。 そして、「会社ID」をリレーションシップで繋いで、クエリで「テーブルA」「テーブルB」の全てのフィールドを表示したとします。 この時、「テーブルA」にデータが5つあり、「テーブルB」にはデータが2つしかなく、結果リレーションシップを通じて対をなすデータが2つしかない場合には、クエリでは2つしかデータが表示されないと思います。 <質問> クエリではリレーションシップで対をなさないデータは無効となるようですが、対をなさないデータも全てクエリで表示する方法はないのでしょうか。 上記例でいうと、「テーブルA」のデータ5件全てについて表示させたいのですが。もちろん、「テーブルA」のデータ中対をなしていないものについては、「テーブルB」のフィールド内容については「空白」での表示となりますが。

  • ACCESSのクエリで同じSQL文だが結果が異なる

    ACCESS2003にて 選択クエリAをSQLビューで開きSQL文をコピー、 新規作成したクエリBのSQLビューに貼り付けて実行したところ、 AとBで結果の件数が異なりました。 そのままBを保存して終了。 BをSQLビューで開き、 SQL文の末尾の;を削除して実行すると、 Aと同じ件数の結果になりました。 再度Bを保存して終了し、 BをSQLビューで開き、 SQL文の末尾の;を削除して実行すると、 Aと異なる件数(元の結果)になりました。 何が原因なのでしょうか。 SQL文の内容は、サブクエリを含んでいて、サブクエリのFROMは SQLSERVERのリンクテーブルです。 よろしくお願いします。

  • アクセスのクエリについて教えてください

    契約日付が数値になっているテーブルを更新クエリで日付形式にし、契約期間が1年未満のデータは削除したいと思っています。 例) (1)20110401 → 2011/04/01 Left(元データ,4)&"/"&Mid(元データ,2)&"/"&Right(元データ,2) という式で更新クエリを作り、契約開始日、終了日とも日付形式にしました。 (2)契約期間1年以上のデータを特定する 契約開始日<="2011/03/31"で契約終了日>="2012/03/31" というテーブル作成クエリを作りました。 しかし、契約終了日がブランクのデータがあり、そのデータも(2)に含めたいと思っています。 ただのブランクであれば、契約終了日の条件式にor Null でいいのかなと思ったのですが、 (1)で更新クエリを実行しているため、ブランクではなく「//」が入っています。 どのような式にすれば、「//」データも含むことができますか? アクセスに詳しくなく、わかりにくい説明で申し訳ありませんが、助けてください。

  • 異なるデータ数から求めた相関値の比較

    時系列のデータA(サンプル数15000程度)とデータB(サンプル数2500程度)があります。この2種類のデータはサンプリング時間は同じですが、サンプリング周期が異なっています。それぞれのデータはXの値とYの値があります。 このとき、データAについて求めたXとYの相関値Aと、データBについて求めた相関値Bは、そのまま比較することはできますか?サンプル数の違いによって、相関値が大きくぶれてしまうことはあるのでしょうか?データAはデータBと同じ数のデータにすべく、データを間引くべきでしょうか? 教えていただけると幸いです。どうぞよろしくお願いします。