• 締切済み

Accessでグループ化した中から最新の登録IDのみを抽出して表示するには?

Access2003を使用しています。 集計クエリでグループ化して、グループのうちの最新のIDのデータ全てを抽出したいのですが、うまくできず大変困っています。 前任者が作成したものを修正していますが、どのような設定で作られているのか把握するだけでも大変なレベルです。 行いたいことは、貸出状況を製造番号別に表示させたいのです。 テーブルには履歴全部が残っています。 フォームで貸出中のみを表示させて、その製造番号のボタンをクリックするとその製造番号が持つデータすべてが見れるようになっています。 フィールドは約10項目あります。 ・「製造番号」フィールドをグループ化 ・他のフィールドは「先頭」 ところが「先頭」「最大」というのはタイミングでターゲットになるデータがかわってしまうようで、正しく抽出してくれません。 「最小」「最大」でもうまくできません。 Accessに詳しい方ならこのような場合、どのような方法をとられますか? 仕組み自体が大幅に変わる方法でも構いませんので、どなたか良いアドバイスをご教示いただけないでしょうか? 以前にも同じ質問をさせていただいておりますが、解決に至らなくて他の方からのアドバイスもいただきたいと思い再び投稿させていただきます。

  • 375k
  • お礼率60% (176/289)

みんなの回答

noname#60992
noname#60992
回答No.6

代替機の貸出ステータス及び貸し出し履歴を閲覧したいのか、もしくは故障機のステータス管理をしたいのかというのがまだわかりませんが、たぶん、故障機のステータス管理をということだと思いますので違っていたら補足をしてください。 ベストな方法ではありませんが、考えやすい方法として2段階クエリというのはありだと思います。 ただし、2段階クエリのSQL文を直接見れませんので、順番がどのようになるのかは私にもはっきりわかりません。 よって、最初のクエリをいったんテーブルに書き出すとうまくいく場合があります。(このあたりがベストな方法でない理由です。)  最初のクエリで行うべきことは、表示させたいものを選び出し、製造番号順に並べ、それを受付日順に並べ仮のテーブルに書き出してください。(全機器を見たいならWHERE句は要りません)(降順、昇順というのは抽出されたレコードを並び替えるものです。 並び替えた後抽出するものではありません。) SELECT * FROM T_REPAIRRECORD INTO T_ORDEDRECORD ORDER BY [故障製造番号],[受付日] DESC; これを行えばあとは故障製造番号でグループ化をして、最初のレコードを見るようにしておけばよいわけです。(一番目のクエリをレコードソースとしてグループ化を行えばよいわけです。) SELECT FIRST(貸出し製造番号),故障製造番号,FIRST(ユーザー名),FIRST(受付日),FIRST(貸出日),FIRST(故障機到着日),FIRST(修理完成日),FIRST(修理機発送日),FIRST(備考) FROM T_ODRDRECORD GROUP BY 故障製造番号; まあ、インデックスを受付登録日時などにしておくと順番がうまいこと保持されることもありますが、DBによって動作が違ったりする可能性もありますので、いろいろ試してみるのが良いと思います。 注意事項としては、テーブルを一日に何回も作り直したりするとレコード数によってはデータベースがどんどん大きくなりますので、時々最適化をする必要があります。 思いつくこととしては、このテーブルに返却日がないことかな。 あと、場合によっては完了フラグみたいなものを作っておけば、完了していないものを一度に選び出すなど処理は簡単になると思うのですが、現状をはっきり把握していない素人の意見として聞いておいてください。

noname#60992
noname#60992
回答No.5

>行いたいことは、貸出状況を製造番号別に表示させたいのです。 状況と質問がはっきりとわからないのですが、 状況 1.ひとつ以上の種類の製品を扱っていて 2.ひとつの製品種別あたり固有の製造番号を持つ複数の製品を保有していて、 3.ひとつの製品を複数回数貸し出す。 現在できていること 貸出中の製品をリストとして表示すること。 行いたいこと 1.リストより製品を選んだ際にその製品の貸出履歴を履歴の新しい順に表示させたいということであれば、特にグループ化は必要ないと思います。 SELECT * FROM T_RentalHistory WHERE ID = LIST.TEXT ORDER BY Rental_Date; のようなクエリを別なリストのレコードソースとすればよいのではないでしょうか? 2.すべての製品の最新の貸出履歴のみを表示させたいのであれば、 SELECT ID,Name,Max(Rental_Date) AS 最新貸出日 FROM T_RentalHistory Group by ID, Name; のような感じでできると思います。(最大を選んでいます) いまいち質問を理解し切れていないので的外れな回答でしたらご容赦ください。 テーブルのデータ構造をある程度示して、何を表示させたいか詳しく補足いただけたらピンポイントな回答も出てくると思います。

375k
質問者

補足

内容足らずな質問ですみません。 行いたいことは、製造番号別にまとめて、その製造番号の最新の履歴だけを表示させて貸出しの状況を把握したいのです。 データは1ユーザー1件のIDがふられます。 テーブルは、 ID・・・数値型 貸出し製造番号・・・テキスト型 故障製造番号・・・テキスト型 ユーザー名・・・テキスト型 受付日・・・日付型 貸出日・・・日付型 故障機到着日・・・日付型 修理完成日・・・日付型 修理機発送日・・・日付型 備考・・・メモ型 クエリは2段階の構想になっているます。 2段階のクエリを集計クエリを使って「故障製造番号」をグループ化にしています。 他のフィールドは「先頭」です。 そして新たに次の2フィールドを加えてあります。 ●貸出し状況・・・IIF関数で状況を切り分けています。 ●演算式・・・製造番号を並べ替える為の式が入っています。 以上のようになりますが、前よりは質問内容がわかりやすくなったでしょうか? お手間をおかけして申し訳ありませんが、よろしくお願いします。

noname#140971
noname#140971
回答No.4

補足: 設計は現場、データ量の反映! ID___有効__相手先___管理番号______製造番号___貸出日_________返却日_________備考 1____No_____鈴木様__2007080001___A-101_______2007/08/01__2007/08/03 2____Yes____中村様__2007080002___A-101_______2007/08/02 3____Yes____鈴木様__2007080003___A-101_______2007/08/03 4____Yes____田中様__2007080004___A-102_______2007/08/04 テーブル設計は、実に、現場作業の反映。 伝票処理システムとして構想すべきか? はたまた、貸出帳簿管理システムとして構想すべきか? これは、どちらが正解ということはないでしょう。 現場のニーズ次第です。 ですから、[管理番号]というアイデア以外は無視して下さい。 要は、ちゃんと、管理する番号を通しで振ったが良いということです。 ただし、年間の通し番号にすると、先月の漏れの追加等が困難になります。 日々の通し番号にすべきか否かは、データ量次第です。

noname#140971
noname#140971
回答No.3

<貸出返却履歴> ID______________LONG________主キー 区分___________BYTE________1;貸出;2;返却 相手先________LONG________1 管理番号_____LONG________2007080001 製造番号_____LONG________1 年月日________DATE_________2007/08/10 備考___________CHAR(32)___追加分 ID___区分____相手先____管理番号_____製造番号____発生日_________備考 1____貸出_____鈴木様___2007080001__A-101_______2007/08/01 2____貸出_____中村様___2007080002__A-101_______2007/08/02 3____返却_____鈴木様___2007080001__A-101_______2007/08/03 4____貸出_____田中様___2007080003__A-102_______2007/08/04 まず、テーブル設計が明らかでないと誰も回答できんでしょう。 上述のテーブルを見ると、貸出返却は、一つのテーブルで管理されていることが判ります。 これは、いずれにしろ、貸出と返却とにテーブルを分けても[区分]でどうとでもなることを意味しています。 次に、貸出しと返却は、[製造番号]ではなく[管理番号]で管理されていることが判ります。 [製造番号]+[相手先]の組合せでも、不可能ではありません。 しかし、「どれが・・・」が問題にならないとも限りません。 また、かかる[管理番号]を付与して、これでもって発生順番を決める以外の妙手はないからです。 [ID]だって、完全に発生順位を特定するもんではありません。 もちろん、[発生日]+[ID]の組合せも発生順位を特定するもんではありません。 [管理番号]を yyyymmnnnn にしておけば、参照範囲も絞りやすいです。 Q、Accessでグループ化した中から最新の登録IDのみを抽出して表示するには? A、この問い自体が設計の不味さを露呈しております。

  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.2

>集計クエリでグループ化して、グループのうちの最新のIDのデータ全てを抽出したいのですが、うまくできず大変困っています。 >フィールドは約10項目あります。 >・「製造番号」フィールドをグループ化 >・他のフィールドは「先頭」 製造番号でグループ化 他の項目は先頭(グループ化の必要は?) 最新のIDのすべてを抽出したい・・(最新の履歴?) グループ化して、取り出そうとしていると言う説明が何度読み返しても、よくわかりませんでした。 もしかして、製造番号グループ化して取り出すのではなく、製造番号ごとの、最新の履歴を取り出したい。 が、目的ですかね? それが目的だとすると 各製造番号毎に、最新のID(最大値のIDと判断します)を取り出す。 SELECT テーブル1.製造番号, Max(テーブル1.ID) AS 最新ID FROM テーブル1 GROUP BY テーブル1.製造番号 これで、製造番号ごとの最新のIDが識別できるので、履歴から一致するデータを取り出す。 となります。 これを、一括でクエリーを作成する場合の SQL文を参考までに書きます。 select x.* from テーブル1 as x inner join (SELECT テーブル1.製造番号, Max(テーブル1.ID) AS 最新ID FROM テーブル1 GROUP BY テーブル1.製造番号) as t on (x.製造番号 = t.製造番号 and x.ID = t.最新ID) (目的が違うようでしたら、読み捨ててください)

375k
質問者

お礼

段階別に作成したクエリをLEFT JOINさせることによって望みのものを作ることができました。 ご回答いただきまして、ありがとうございました。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

>グループのうちの最新のIDのデータ全てを抽出したいのですが こういう場合はサブクエリを使うかDminなどの関数を使った抽出条件を書きます テーブルの情報が全くないのでどのようなものを取り出したいのか分かりませんが 製造番号と日付フィールドがあり製造番号ごとの最新レコードを取り出したいというのであれば 日付の抽出条件欄に In (select max(日付) from テーブル名 as A where A.製造番号=テーブル名.製造番号)

関連するQ&A

  • ACCESSの集計クエリで3件ある場合の[先頭][最後]が正しく抽出できないんです。

    前任者が作成したACCESSを修正しているのですが、解決方法がわからなくて困っています。 集計クエリで集計行は[製造番号]をグループ化にし、他項目は[先頭]を選んでいます。 同グループで3件ある場合、ピックアップして欲しいデータを抽出してくれません。2件しかない場合は[先頭]と[最後]で正しく切替えてくれます。何を基準に見ているのかもわからず途方にくれています。 [製造番号]の[先頭[最後]を見ているのでしょうか? ピックアップしてくれないデータを抽出するにはどうしたらいいでしょうか?そのデータは日付型です。 どなたか助けてください!!

  • アクセス 抽出後も全体の最大値を表示させる

    アクセス超初心者です。 OS:XP Access:2003 仕入情報を入力するフォームを作成しています。 「T_仕入入力詳細」というテーブルを元に、帳票フォームを作成し、そのヘッダーに非連結のテキストボックス「受付番号」で最大値を表示させています。コントロールソースに「=Max([T_仕入入力詳細]![受付番号])」と入れて表示させるようにしていますが、全データを表示していると全体の最大値が表示されるのですが、特定の受付番号のデータを抽出すると、抽出データだけの最大値が表示されてしまいます。 抽出した状態でも全データの最大値を表示させるには、どうやったらいいでしょうか。 どなたかご教授願います。

  • Access2003を使って、複数台ある貸出機を製造番号毎にまとめ最新のレコードだけを一覧表に表示させるには???

    顧客所有の機械に不具合が生じた場合、その修理期間に顧客へ貸出す代替機の履歴をアクセス(Access2003)を使って管理しています。 ところが、次のような時はどのような方法を取ればよいのかわからなくて煮詰まっています。 よいアドバイスをいただきたいと思い投稿をさせていただきます。 次から代替機のことは貸出機と記します。 貸出機は20台あります。 その20台を複数のユーザーに貸し出しています。 台によっては5人に貸している機械もあれば、まったく貸出したことがない機械もあります。 それを貸出機の製造番号ごとにグループにまとめて、 そのうちの貸出日がもっとも新しいものを表示させたいのです。 レコード1件につき入力順によって貸出履歴IDを振っているので、 そのIDがグループの中で最新のものでもいいのです。 要は、製造番号ごとに貸出中なのか待機中なのか一目でわかればいいのです。 集計クエリで「貸出機製造番号」をグループ化にして、他の項目は先頭を使ってみましたが、この先頭と最後という集計方法はHDに記録した順番で変動してしまうので正しい情報を得ることが出来ませんでした。 関数やVBAなどを使ったら、解決されないでしょうか? テーブルの構造は次のようになっています。 仮にテーブルAとします。 [フィールド名]・・・・・[データ型] 貸出機管理ID・・・・・・オートナンバー ユーザNO・・・・・・・・・・テキスト型 貸出機製造番号・・・・・テキスト型 故障機製造番号・・・・・テキスト型 貸出日・・・・・・・・・・・・日付/時刻型 故障機受領日・・・・・・・日付/時刻型 修理発送日・・・・・・・・日付/時刻型 修理返却日・・・・・・・・日付/時刻型 故障機発送日・・・・・・・日付/時刻型 返却日・・・・・・・・・・・・日付/時刻型 担当者ID・・・・・・・・・・テキスト型 備考・・・・・・・・・・・・・・メモ型 上記のテーブルAに別のテーブルBからユーザ名を関連付けてクエリを作りたいです。 また、貸出日に日付があり返却日に日付がなければ"貸出中"、 貸出日と返却日の両方に日付が入っている、もしくは、まったく入ってなければ"待機中”という[現状]の表示をするフィールドをそのクエリ上に設けたいです。 そして、そのクエリを使って[貸出中]と[待機中]の一覧表が欲しいです。 なお、貸出機の製造番号は次のような形式になっています。 99XVC 00XVA 01XVB 製造年の西暦の下2桁+アルファベット3桁の組み合わせになっています。 1900年代から2000年代のものが混在しており、昇順に並べ替えたいので、並べ替える式のフィールドも設けています。 <クエリ> フィールド名・・・・・・・・・テーブル 貸出機管理ID・・・・・・・・・テーブルA・・・  ユーザNO・・・・・・・・・テーブルA ユーザ名・・・・・・テーブルB 貸出機製造番号・・・・・・・・・テーブルA→製造番号毎にグループにまとめる 故障機製造番号・・・・・・・・・テーブルA 貸出日・・・・・・・・・テーブルA 故障機受領日・・・・・・・・・テーブルA 修理発送日・・・・・・・・・テーブルA 修理返却日・・・・・・・・・テーブルA 故障機発送日・・・・・・・・・テーブルA 返却日・・・・・・・・・テーブルA 担当者ID・・・・・・・・・テーブルA 備考・・・・・・・・・テーブルA 機械の現状・・・フィールドに条件式を入れる 貸出機製造番号を並替えるためのフィールド・・・並べ替えの条件式を入れる このような構造なのですが、皆様だったらどのような方法を取られますか? 製造番号毎に最新のレコードだけを表示させる所以外は問題なく解決されています。 この内容と似た質問を過去に何度か投稿させていただいています。 数名の方からいくつかの方法を教えていただき、試しているところですが、解決に至らず、より詳しい情報を載せて質問を再投稿させていただきます。 前の質問を締め切らない状態で、再投稿することは、お答えくださった回答者の方には大変、失礼なことをしており申し訳なく思います。 この場をお借りしてお詫びさせていただきます。

  • Accessでの抽出について

    Accessで下記のようなテーブルがあるとします。 フィールド1  フィールド2  フィールド3 ----------------------- Aさん      20       200 Aさん      10       180 Bさん      10       300 Cさん      10       250 Cさん      30       310 条件1・・・フィールド2が「20」 条件2・・・フィールド3が「200」 この条件が当てはまる、フィールド1のデータはすべて抽出というふうにしたいのですが・・・。 (上記のテーブルでは、1件目と2件目のレコードがあてはまります。) どのようにして抽出したらよいでしょうか?よろしくお願いします。 Access2000を使用します。

  • アクセス クエリ抽出

    アクセスのクエリについてお伺いします。各フィールド毎に行をずらして抽出条件を入れて、1つでも条件があった場合にはそのデータ全てを抽出するようにしています。その抽出されたデータの中で、条件が一致したものについてのみフォントの色(例えば:赤)を変えて表示する事はできないでしょうか。よろしくお願いします。

  • アクセスフィールドの抽出条件について。

    アクセスに取り込んだデータに 連続番号があったとします。 クエリの抽出条件で 連続番号が奇数の場合のレコードを抽出 連続番号が偶数の場合のレコードを抽出というように 奇数偶数の作業列を作らず 抽出条件を一気に判定することは出来ますでしょうか。 一応試したのが作業列を作る方法ですが 例えば50フィールドあるクエリを作成し 連続番号をキーに フィールド mod 2 とすると 奇数偶数の判定が出来 抽出条件は満たすのですが フィールドのmodの判定で 連続番号が上書きされてしまいます。 また http://www.mahoutsukaino.com/ac/ac2000/ac2000/nigyo/gyo02.htmの ようにすると フィールド数が足りなく すべてのフィールドが追加出来なくなります。 どなたかアドバイスよろしくお願いします。

  • accessの抽出条件で数字の比較をしたい

    office2010 サーバのviewテーブルをaccessでODBC接続し、accessからexcelにデータを持ってくる 構成があります。 accessのHYOHEN_NOというフィールドに対し、クエリ条件をlike "15%"として2015年のデータを抽出しています。 最初15%は15*としていたのですが、excelのマクロADOで持ってくる場合は15%とのことで 上記クエリ条件にしています。 来年になると、このフィールドには16-****というデータが入ってきます。 このフィールドは、数字から始まるデータだけでなく、英語から始まるデータも入っています。 HYOHEN_NOフィールドで先頭の2文字が14より大きいものを抽出したいのですが、 どの様にしたらよいでしょうか?

  • ACCESS2000でのレコード抽出

    OS:WindowsXP ACCESS2000 あるフィールドの値が最大となるようなレコードを選択クエリで 抽出しようとしているのですがうまくいきません。 テーブルのフィールドは4個あります。 テーブル [系列] [優先度] [データ1] [データ2] ここで各系列ごとに優先度が最大となるレコードのみを 抽出したいのです。 系列、データ1、データ2は重複がありえます。 優先度は系列を跨いだ重複はありますが、 同系列内での重複はありません。 レコードの例) 1:系列A 優先度1 データA データB 2:系列A 優先度2 データC データD 3:系列B 優先度1 データE データF 上記の例で言いますと、レコード2:とレコード3:のみを 抽出するクエリを作成したいのです。 集計クエリで優先度のフィールドを「最大」にしても、 3つのデータ全てが抽出されてしまいます。 どなたか解決策をご教示ください。

  • 【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 終了

  • Accessのクエリのデータ抽出のエラー?について

    お世話になります。 Accessのクエリでのデータ抽出について教えてください。 テーブルからフィールドを商品コードと出荷日の2つを選択し、 集計を使用して、商品コードでグループ化して、出荷日で最大にします。 すると、抽出条件で商品コードを指定すると抽出できるのですが、抽出条件で 指定せずすべてのデータを抽出すると出てこない商品コードがあります。 たとえば[A]という商品コードを抽出条件に指定すると抽出できるのですが、 抽出条件で指定せずすべてのデータを抽出するとこの[A]という商品コードが 抽出されません。 何が理由なのかお分かりになりましたらどうぞよろしくお願いいたします。 当方SQLがわかりませんのでクエリのデザインビューでご説明いただけますと 幸いです。