* クエリでの最新データの抽出について [#w42ce839]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|urudakara|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Base データベース,faq03,category)|
 |~投稿日|2011-07-10 05:22:48 (日)|
 |~OS|Linux (ubuntu 10.04)|
 |~依存するページ||
 |~バージョン|#listbox3(3.3.0,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#o983525f]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 こんにちはいつもお世話になっています。
 
 今回はクエリによる最新データの抽出について質問します。
 
 サンプルをアップロードしているので確認してみてください。
 
 今回はサンプルのテーブル「発行データ」のから発行回数が最大のレコードを、クエリで抜き出したいと思っています。
 
 サンプルの例だと
 
 具体的には
  
  識別番号  発行回数  発行日
   1            3          H23.04.04
   2            2          H23.02.05
   3            4          H23.01.22
 
 と言うような結果になるクエリが出来ればと思ってます。
 
 それではよろしくお願い致します。
  
 
 
 ----
 ***正しいのか分かりませんが… [#e464599f]
 >ike@九州 (2011-07-10 08:52:15 (日))~
 ~
 以下で一応は可能でした。~
  SELECT "識別番号", "発行回数", "発行日" 
  FROM "発行データ" , ( SELECT "識別番号" AS "識別番号G", MAX( "発行回数" ) AS "発行回数M" FROM "発行データ" GROUP BY "識別番号" ) 
  WHERE "識別番号" = "識別番号G" AND "発行回数" = "発行回数M" 
  ORDER BY "識別番号" ;
 
 //
 ***2回に分けるとわかりやすい [#n1fe3c17]
 >M.Kamataki (2011-07-11 22:54:06 (月))~
 ~
 集計関数は「GROUP BY」句でまとめたフィールドを対象に計算します。また、集計関数を設定できるのは1フィールドだけなので、ike@九州さんのSQLのように2つのSELECT文をネストさせるか、クエリーとテーブルのリレーションで実現するしかないと思います。~
 ~
 クエリーを使う方法は、まず、「識別番号」フィールドでグループ化して「発行回数」フィールドの最大値を求めるクエリーを作成します。このクエリーと「発行データ」テーブルをリレーションすると、ike@九州さんの結果と同じになります。~
 ~
 一応、サンプルファイルを添付します。~
 ~
 &attachref(faq6_264sample1.odb);~
 
 //
 ***やってみます。 [#wd32c031]
 >urudakara (2011-07-13 11:22:18 (水))~
 ~
 こんにちはike@九州さん、Kamatakiさん~
 丁度ike@九州さんに提示していただいた解決方法を自分のデータベースに応用していて上手く行かずにもう一度質問を投稿しようとしていた所でしたが、~
 Kamatakiさんのヒントで何か出来そうな気がしてきました。~
 もう少し時間をいただいて試してみます。~
 ~
 ですので今しばらく回答中のままでお願いします。~
 
 //
 ***うまく出来なくて・・・ [#rec0cca2]
 >urudakara (2011-07-17 22:48:20 (日))~
 ~
 いつもお世話になってます。~
 ~
 前回にサンプルを挙げて頂いたのですが、自分でやるとなかなか上手く出来ません・・・。~
 自分が応用しようとしているファイルのデータがついたサンプルを挙げますので、もう少し教えてください。~
 よろしくお願いします。~
 
 //
 ***うまくできない点は? [#a87c16fc]
 >M.Kamataki (2011-07-18 10:24:59 (月))~
 ~
 コメントからはうまくできないという点がよくわかりません。作成したクエリーでエラーが出て実行できないのでしょうか。それともクエリーは作成できるものの期待した結果にならないのでしょうか。~
 ~
 例えば、以下の図のようなクエリーではエラーにもなりませんし、期待した結果も得られていると思います。~
 ~
 &attachref(faq6_264_01.png,nolink);~
 ~
 サンプルファイルを添付します。~
 ~
 &attachref(faq6_264sample3.odb);~
 
 //
 ***出来ましたたん [#if89003e]
 >urudakara (2011-07-22 10:40:22 (金))~
 ~
 こんにちはkamatakiさん ike@九州さん。~
 ~
 kamatakiさんの指摘通り出来ました。~
 ここにアップするためデータベースのfrom句の後に来る部分を単純にしたサンプルをあげました。それをそのまま使用していたのでエラーが出ていました。~
 ~
 SQL文の文法からわからないのを、一部を「こうじゃないのかなあ・・・」と言う具合に買えていたのですが、~
 一度キチンと勉強することが大事だと思い色々調べていたため返答が遅くなりました。すみません。~
 ~
 また気づかされたのが、デザイン画面からも同様な物が作れるということ。~
 結合線が1本しかないクエリしか見たことがありませんでしたから目から鱗でした。~
 kamatakiさんのSQL文からクエリを作ってそれを編集メニューからデザイン画面を見て、~
 同様に自分で新規にウィザードを使用してクエリを作ってみた所同様な事が出来ました。感心しました。~
 ちょっと疑問に思ったのですが、すべてのSQL文はウィザードを使用して作れるのでしょうか?~
 それとも複雑なものはSQL文を直接書かないとダメなのでしょうか?~
 ~
 もしよかったらその辺を知っている方がいたら教えてください。~
 
 //
 ***ウィザードでもできますが [#baa9bf27]
 >M.Kamataki (2011-07-23 16:23:57 (土))~
 ~
 「ウィザードを使用して」というのは、Baseの[クエリー]-[ウィザードを使用してクエリーを作成]メニューを利用して、ということでしょうか。こちらでは[クエリー]-[デザイン表示でクエリーを作成]のすべてのクエリーは作成できません。主に利用するのは、1つのテーブルに対して条件を与えてレコードを抽出したり、集計用のクエリーを作成する機能しかありません。2つ以上のテーブルによるリレーションには対応していないので、万能じゃないです。~
 ~
 なお、SQL文は上に挿入したクエリーのデザイン表示の図の赤枠で囲ったボタン[デザインビューのオン/オフ切り換え]で切り換えられます。クエリーデザイン上のリレーションがどのようなSQL文に書き換わるか、参考になると思います。~
 ~
 また、UNIONクエリーなど、SQL文を直接書かないといけないものは存在します。この直接書かないといけないものの判断は、SQLの解説書どおりに入力したにもかかわらずエラーになる場合に試してください。当Q&AではそのようなSQL文はだいたい洗い出しはできているはずです。~
 
 //
 ***やってみます [#se5c4d49]
 >urudakara (2011-07-25 05:21:24 (月))~
 ~
 こんにちはkamatakiさん~
 自分でデザイン画面で複雑な物を作りそれをSQLで確認して見てみます。~
 UNIONクエリーは知らないものですね・・・。~
 頑張ってみます。~
 ~
 いつも丁寧な回答ありがとうございました。~
 これで終了とさせていただきます。~
 
 //
 #article