Access初心者必見!クエリで最新データを抽出する方法

このQ&Aのポイント
  • Access初心者のための、クエリで最新データを抽出する方法をご紹介します。
  • テーブル内のデータから、最新の情報のみを抽出する方法を解説します。
  • サブクエリの指定方法についても簡単に説明します。
回答を見る
  • ベストアンサー

access2007

アクセス初心者です。 アクセスのテーブルからクエリを作っていますがわからないので教えてください。 下記の様なテーブルがあり ID番号    氏名    名称     枝番  10000     大山   作業場     2 10000     大山   事務所     1 10000     大山   作業場     4 10000     大山   自宅       3 10005     片山   作業場     2 10005     片山   事務所     1 10005     片山   作業場     4 10005     片山   自宅       3 10005     片山   作業場     5 クエリで以下の様に枝番の最大値を見て枝番が最大値の「名称」だけを抽出したい ID番号    氏名    名称     枝番  10000     大山   作業場     4 10005     片山   作業場     5 枝番は最新の情報が大きな数字です。 実行後には枝番は表示させず、ID番号と氏名、名称だけ表示させます。 抽出条件の部分にselect MAX(枝番) from テーブル名; と記載しましたが、 「サブクエリの指定が正しくありません。サブクエリはかっこで囲んで指定してください」 というエラーメッセージが出ます。 どこをどう触ればいいかわからないのでご教授ください。

  • NSrai
  • お礼率59% (19/32)

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

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

SELECT   ID,   氏名,   名称 FROM   [SELECT       DLookup("ID", "T1", 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS ID,       氏名,       DLookup("名称", "T1", 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS 名称,       Max(枝番) AS 枝番の最大   FROM T1   GROUP BY T1.氏名]. AS [%$##@_Alias]; 以上のSQL文で目的は達成できます。 ■簡略化のポイント: SELECT     DBLookup("SELECT ID FROM T1 WHERE 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS ID,     氏名,     DBLookup("SELECT 名称 FROM T1 WHERE 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS 名称,     Max(枝番) AS 枝番の最大 FROM T1 GROUP BY T1.氏名];  それは、Access の DLookup()関数を使うことです。そうすれば、サブクエリを利用しなくても条件に合致するレコードの<ID、氏名、名称、枝番の最大>を取得することができます。その後に、その SELECT文をサブクエリにすると超簡単ですよ。 ■DLookup()の代替関数のお勧め:  DLookup("ID", "T1", 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS ID   ↓  DBLookup("SELECT ID FROM T1 WHERE 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS ID  簡略化のポイントでは、DBlookup()を利用しています。 Public Function DBLookup(ByVal strQuerySQL As String, _                 Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _       CurrentProject.Connection, _       adOpenStatic, _       adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = Nz(DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _     "・Err.Description=" & Err.Description & Chr$(13) & _     "・SQL Text=" & strQuerySQL, _     vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function T1⇒業務内容に! 【注意】 1、テーブル構造には大きな問題点があります。 2、最大値が重複した場合の戻り値は保証されません。 1は、単なる練習であれば無視していいです。業務用の雛形だと改善すべきです。

NSrai
質問者

お礼

ご丁寧に教えていただきありがとうございます! 興奮して下記のSQL文をコピペしてみましたが 「かっこの使い方が正しくありません」と表示されます。 どうしてでしょうか・・・ SELECT   ID,   氏名,   名称 FROM   [SELECT       DLookup("ID", "T1", 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS ID,       氏名,       DLookup("名称", "T1", 氏名='" & [氏名] & "' AND 枝番=" & [枝番の最大]) AS 名称,       Max(枝番) AS 枝番の最大   FROM T1   GROUP BY T1.氏名]. AS [%$##@_Alias];

その他の回答 (2)

回答No.3

補足:図を添付しておきます。

回答No.1

SQL文を提示したがいいですよ。 SELECT     ID,     氏名,     名称 FROM     [SELECT ・・・     FROM T1     GROUP BY T1.氏名]. AS [%$##@_Alias]; このようにサブクエリは[]で囲むのが決まりです。

NSrai
質問者

補足

コメントありがとうございます。 アクセスが全くの素人なのでどこを触ればいいのかが全く分かりません。 素人でも分かるように教えていただけないでしょうか? ちなみに使用しているテーブル名は「業務状況」 です。 「T1」というのは何を示しているのでしょうか?

関連するQ&A

  • クエリ・テーブルについて教えてください。

    access2003です。 作業番号・部コード・課コード・氏名を作業番号をキーに各テーブルから取り出すテーブル作成クエリを作成しました(名称:作業番号クエリ)。 新しく部コード・課コード・フラグ(1~9)のテーブルがあります。 「作業番号クエリ」のテーブルからフラグが3・4・6・7の部コードのみを取り出すテーブル作成クエリをつくりたいのです。 どのようにすればよいのでしょうか?抽出条件は3or4or6or7だと思うのですが、これ以外わかりません。教えてください。 作業番号 部コード 課コード 氏名 100010 001 2001 森田 100012 003 2004 森本 100018 002 2003 山本 100019 001 2002 山田 部コード 課コード フラグ 001 2001 1 001 2002 4 002 2003 3 003 2004 2 004 2005 4 005 2006 5 005 2007 6 005 2008 7 003 2009 8

  • Access クロス集計でフィールド名001~連番

    テーブルAを元にクロス集計クエリを作り、フィールド名をDCount関数で連番になるようにしています。 列名: "枝番" & DCount("*","テーブルA","[商品番号]='" & [商品番号] & "' and 枝番<='" & [枝番] & "'") あまり詳しくない為、以下のページを参考にさせてもらいました。 http://okwave.jp/qa/q3037682.html すると、クロス集計クエリのフィールド名が以下のようになります。 枝番1 枝番10 枝番11…枝番2 枝番20… できることなら、枝番001 枝番002 枝番003…枝番010 枝番011…のように並んで欲しいのですが、そうするためにはどんな設定又は関数?が必要ですか? 作業環境は、OS:Windws7、使用ソフト:Access2003です。 勉強不足で申し訳ありませんが、ご教授お願い致します。

  • ACCESS 重複データに枝番を振りたいのですが

    ACCESS2000を使っています。超初心者です。 製品の修理受付管理DBから再修理のみを抽出したいのですが、DBには再修理のフラグが無いために、製造番号の重複を取り出し、それに枝番を振ることで、枝番2以上のデータを再修理受付として管理したいと考えています。しかし重複データのみを重複クエリで抽出するところまではできたのですが、そのデータへの枝番の振り方がわかりません。 《例》 こんなテーブルがあります。 受付番号 製品名 製造番号 修理内容 AAA  テレビ(1)  111  あああ BBB  テレビ(2)  222  いいい CCC  テレビ(3)  333  ううう DDD  テレビ(1)  111  えええ EEE  テレビ(2)  222  おおお FFF  テレビ(1)  111  かかか このテーブルをこんな感じに抽出して枝番フィールドを追加したいです。 受付番号 製品名 製造番号 枝番 修理内容 AAA  テレビ(1)  111  1  あああ DDD  テレビ(1)  111  2  えええ FFF  テレビ(1)  111  3  かかか BBB  テレビ(2)  222  1  いいい EEE  テレビ(2)  222  2  おおお 以上です。 ご教授のほどよろしくお願いします。

  • 【Access】選択クエリのグループ化で最大日付の中の最大IDを抽出する方法?

    「製品の販売状況が記録してあるテーブル」から、Accessの選択クエリのグループ化を利用して、「1つの製品番号に対し、最大日付の中の最大IDを抽出する」というアクションを行いたいのです。 例えば下の<テーブル例>だったら、  ●製品100・・・2004/08/20 ID3 販売停止  ●製品111・・・2004/05/10 ID6 出荷停止 を取り出したい訳です。 ・製品番号(グループ化/昇順) ・日付(グループ化/昇順/最大) ・ID(グループ化/昇順/最大) という選択クエリを組んだのですが、抽出結果は  ●製品100・・・2004/08/20 ID9 販売停止  ●製品111・・・2004/05/10 ID6 出荷停止 を選んでしまいます。 違うのに! そんな事したいんじゃないのに!(ToT) どなたか詳しい方、助けてください。 <アクション> 製品の販売状況が記録してあるテーブルから、『最大の日付で最大のID』の「販売状況」を抽出したい。 <テーブル例> 製品番号 日付   ID 販売状況 100 2003/02/01  4 終了 100 2004/07/01  9 出荷停止 100 2004/08/01  2 一時出荷停止 100 2004/08/20  3 販売停止 100 2004/08/20  1 終了 111 2003/01/15 5 終了 111 2004/05/10 6 出荷停止 111 2004/05/10 2 終了

  • ACCESS2003

    ACCESS2003 OS:winXPです。 アクセスのテーブルのデータが以下のようになっています。 ID  |名称|番号1|番号2|番号3|・・・・・|番号30| 100|太郎|0001|1231|4323|・・・・ 101|次郎|2333|3213|4225|・・・・ ・・・ 番号1~番号30にはIDに紐づくランダムな値が入っています。 IDによって紐づく番号が存在するだけ、30まで列に入っています。 番号30まであるものもあれば、番号1しかないものもあります。 これを以下のように変えたいと思っています。 ID  |名称|番号 | 100|太郎|0001| 100|太郎|1231| 100|太郎|4323|  ・  ・ 101|次郎|2333| 101|次郎|3213| なにかクエリ、VBAなどでいい方法はないでしょうか?

  • Accessのクエリで、抽出条件で…のエラーが

    緊急事態となりました。お知恵を貸してください。 今まで使えていたクエリが、突然使えなくなってしまいました。 一瞬、正しいデータが見えたかと思うと、【抽出条件でデータ型が一致しません】のエラーとともに、 すべてのデータが"#Name?"になってしまいます。 紐づけてある項目と項目は、同じデータ型に合わせてあります。     テーブルA                  テーブルB     電話番号(テキスト)の"-"抜き --→ 電話番号(テキスト)の"-"抜き     管理ID                    氏名     名前                      コメント テーブルAの管理番号 , テーブルBの氏名 と表示したいのですが、エラーになってしまいます。 わかりにくくて申し訳ありません。 どうか、宜しくお願いいたします。

  • ACCESSで複数テーブルのクエリ抽出

    ACCESSで複数テーブルのクエリ抽出 初めて投稿させてもらいます。 テーブル1・・・社員ID(主キー)、氏名 テーブル2・・・社員ID(重複キー有)、顧客ID テーブル3・・・社員ID(重複キー有)、得意先ID テーブル4・・・顧客ID、顧客氏名 テーブル5・・・得意先ID、得意先 上記のテーブル内容を1つのクエリで全部抽出するとき、 テーブル1の社員ID[a]とテーブル2の社員ID[a] と テーブル1の社員ID[a]とテーブル3の社員ID[a] を分けて抽出する方法ってありますか? クエリの結合プロパティで テーブル2の全レコードとテーブル1の同じ結合フィールドと テーブル3の全レコードとテーブル1の同じ結合フィールドにすると 「あいまいな外部接続が含まれているのでSQLを実行出来ません」とエラーになり、 テーブル1の全レコードとテーブル2の同じ結合フィールドと テーブル1の全レコードとテーブル3の同じ結合フィールドにすると 社員ID[a]、顧客ID[1]、得意先ID[α]、顧客氏名[吉田]、得意先[○○商事] 社員ID[a]、顧客ID[1]、得意先ID[β]、顧客氏名[吉田]、得意先[△△金融] みたいになってしまうのです。 やりたい結果は 社員ID[a]、顧客ID[1]、得意先ID["空欄"]、顧客氏名[吉田]、得意先["空欄"] 社員ID[a]、顧客ID["空欄"]、得意先ID[β]、顧客氏名["空欄"]、得意先[△△金融] 説明下手ですいませんが、ご教授の程よろしくお願いします。

  • アクセスのクエリの使い方(基本?)

    氏名と複数項目のデータをもつテーブルがあります。半年後とに新たに同項目によるテーブルとして追加されます。 氏名は重複あり、また追加や次には削除もあります。 A~Eさんのデータがあるテーブル1と、B~Hさんまでのテーブル2で (1)全員分のデータにしていくつかの項目のデータをクエリで抽出したいのですが、選択クエリだとAさんは消えます。 (2)ある項目について要件を満たす氏名をどちらかも抽出したい。 クエリでは無理だと聞いたことがありますが本当に無理でしょうか?

  • ACCESS 比較後の抽出

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

  • Access2013テーブル結合クエリ

    Access2013 住所録テーブルと面談備忘録テーブルを、氏名で結合したクエリを作成したいのですが。 この二つのテーブルの氏名が重なり合わないものもあります。 この際、重なり合わない氏名などもクエリのデータシートビューに表示させる方法を教えてください。 フィールドの抽出条件になにか記入するのかなと思っています。初心者です。 宜しくお願いします。

専門家に質問してみよう