gooポイントが当たる質問投稿キャンペーン>>

社員ID/交通費/登録日 のフィールドがあるテーブルがあります。

社員ID/交通費/登録日
0001  800  2007/4/1
0002  400  2007/4/2


0001 700  2007/5/2

となった場合、0001の人は700円と言う風に登録日が最新のものを抽出したいのですが

クエリをつくり登録日の集計を「最大」にしてみたら、日付は5/2がちゃんと出ますが、金額がその登録日以外の金額になるのです。

どうすればよいでしょうか?
分かる方教えて下さい。宜しくお願いします。

 

A 回答 (5件)

>登録日の更新条件欄というのはどこにあるのでしょうか


それはそれで別に設定してください
    • good
    • 0

SQL文とクエリは同じです。



フィールド:登録日
テーブル:TEST
並び替え:
表示:
抽出条件:DLOOKUP("MAX(登録日)","TEST","社員ID=" & 社員ID);
または:

フィールド:登録日
テーブル:TEST
並び替え:
表示:
抽出条件:(SELECT MAX(登録日) FROM TEST AS B WHERE TEST.社員ID=B.社員ID)
または:

このように、クエリを編集すれば良いということです。
ですから、事実上は、"TEST" だけを実際のテーブル名、クエリ名に置き換えるだけです。
    • good
    • 3
この回答へのお礼

いつもご丁寧な回答嬉しいです。

教えていただいたとおりにして出来ました。
本当にありがとうございます。

お礼日時:2007/06/21 14:07

<TEST>


ID___社員ID___交通費___登録日
1____101___________\100___2007/01/01
2____102___________\200___2007/02/02
3____101___________\300___2007/03/03
4____102___________\110___2007/04/04
5____101___________\220___2007/05/05

<クエリ1>
4____102___________\110___2007/04/04
5____101___________\220___2007/05/05

一番簡単なのは、その行の[社員ID]のMAX(登録日)と一致する[登録日]の行を SELECT すること。

SELECT *
FROM TEST
WHERE 登録日=DLookup("MAX(登録日)","TEST","社員ID=" & 社員ID);

もちろん、DLookup 関数の部分を SQL文で書くことも可能です。

×
SELECT *
FROM TEST
WHERE 登録日=(SELECT MAX(登録日) FROM TEST WHERE 社員ID=社員ID);


SELECT *
FROM TEST AS A
WHERE 登録日=(SELECT MAX(登録日) FROM TEST AS B WHERE A.社員ID=B.社員ID);

単にDLookup 関数の部分をSQL文にしても正しい結果は得られません。
その行の[社員ID]を、A.社員ID で表現する工夫。
最大値の検索対象としての[社員ID]を、B.社員ID で表現する工夫。
などが必要となります。
    • good
    • 3
この回答へのお礼

回答ありがとうございます。
ですがSQLは私にはちょっと難しい回答だったので、解決できませんでした・・

いつも丁寧に回答くださりありがとうございます。

お礼日時:2007/06/21 11:22

登録日の更新条件欄に



In (select max(登録日) from テーブル名 as A where A.社員ID=テーブル名.社員ID)


テーブル名にはそちらのテーブル名を
Aはそのままでいいです
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

登録日の更新条件欄というのはどこにあるのでしょうか・・・すみません。その辺もまだ分かってない初心者なので・・・
もうちょっと勉強してみます。

お礼日時:2007/06/21 11:17

理屈の上では


1.選択クエリーの作成 社員idと登録日でsortのため
2.上記クエリーを入力としての 集計クエリーを作成
   ここでは、グループ用項目は 社員id
   交通費のところは 「最後のレコード」とする
でできるはずです

しかし、ACCESSの集計クエリーは、実際には
自分では想定しないような結果を出すことが多くあります
わたしは、バグなのではないかと思っているので

上記のクエリーで、うまく結果が出ない可能性があります
そのときはごめんなさいです
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

上記のとおりにしてみたのですが、やっぱり日付は最新のものが出るのに金額が出なかったです。

お礼日時:2007/06/21 11:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessで最新のレコードを抽出するには

お世話になります。

このようなテーブルがあるとします。

No|日時     | 部門  | 更新内容 
--+------------+--------+----------
1 |04/12 12:21:35| A部門 | 更新C
2 |04/07 09:15:05| B部門 | 更新う
3 |04/19 08:23:45| A部門 | 更新A
4 |04/05 10:15:20| B部門 | 更新あ
5 |04/20 09:20:13| B部門 | 更新い
6  |04/02 09:20:15| A部門 | 更新B

この中から部門毎にグループ化して
部門毎に日時の最新のデータ

No|日時     | 部門  | 更新内容 
--+------------+--------+----------
3 |04/19 08:23:45| A部門 | 更新A
5 |04/20 09:20:13| B部門 | 更新い

を抜き出すクエリの作り方を教えてください。
ちなみに今困っているDBの更新内容に相当するフィールドは50フィールドほどあります。
よろしくお願いします。

多分クエリの集計を使用すると思っています。
多少ですがSQLわかります。
多少ですがVBAわかります。

お世話になります。

このようなテーブルがあるとします。

No|日時     | 部門  | 更新内容 
--+------------+--------+----------
1 |04/12 12:21:35| A部門 | 更新C
2 |04/07 09:15:05| B部門 | 更新う
3 |04/19 08:23:45| A部門 | 更新A
4 |04/05 10:15:20| B部門 | 更新あ
5 |04/20 09:20:13| B部門 | 更新い
6  |04/02 09:20:15| A部門 | 更新B

この中から部門毎にグループ化して
部門毎に日時の最新のデータ

No|日時     |...続きを読む

Aベストアンサー

SQLを考える時は理論の組み立てが肝要です。
(1)部門別に日時の最大値を求める。
(2)テーブルから、部門と日時が(1)と同じものを求める。
厄介なのは英語だから逆になることです。

SELECT A.* FROM テーブル AS A INNER JOIN
(SELECT 部門,MAX(日時) AS 日付 FROM テーブル
GROUP BY 部門) AS B
ON A.部門=B.部門 AND A.日時=B.日付

()の中のサブクエリが(1)になります。外側のSELECTが
(2)に該当します。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

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 = IIf(Len(DataValue & ""), 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

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

Q【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販売状況
1002003/02/01  4終了
1002004/07/01  9出荷停止
1002004/08/01  2一時出荷停止
1002004/08/20  3販売停止
1002004/08/20  1終了
111 2003/01/15 5 終了
111 2004/05/10 6 出荷停止
111 2004/05/10 2 終了

「製品の販売状況が記録してあるテーブル」から、Accessの選択クエリのグループ化を利用して、「1つの製品番号に対し、最大日付の中の最大IDを抽出する」というアクションを行いたいのです。
例えば下の<テーブル例>だったら、
 ●製品100・・・2004/08/20 ID3 販売停止
 ●製品111・・・2004/05/10 ID6 出荷停止
を取り出したい訳です。

・製品番号(グループ化/昇順)
・日付(グループ化/昇順/最大)
・ID(グループ化/昇順/最大)
という選択クエリを組んだのですが、抽出結果は
 ●製...続きを読む

Aベストアンサー

ロジック的には No.1 の方の方法と同じことなんですが、Access 2000 のあたりから SQL の中にサブクエリーを記述できるようなので(記憶が定かではないのですが、Access97 まではできなかったような気がします。)、Access 2000 以降であれば、クエリーの SQL ビューに次のように記述すれば目的の抽出が可能です。
(テーブルを T_販売状況 としています。)

SELECT T3.製品番号, T3.日付, T3.MAXID, T4.販売状況
FROM T_販売状況 AS T4 INNER JOIN (
SELECT T1.製品番号, T1.日付, MAX(T1.ID) AS MAXID
FROM T_販売状況 AS T1 INNER JOIN (
SELECT 製品番号, MAX(日付) AS MAX日付
FROM T_販売状況
GROUP BY 製品番号) AS T2
ON ( ( T1.製品番号=T2.製品番号) AND (T1.日付=T2.MAX日付) )
GROUP BY T1.製品番号, T1.日付) AS T3
ON ( T3.製品番号 = T4.製品番号 AND T3.日付 = T4.日付 AND T3.MAXID = T4.ID )

ロジック的には No.1 の方の方法と同じことなんですが、Access 2000 のあたりから SQL の中にサブクエリーを記述できるようなので(記憶が定かではないのですが、Access97 まではできなかったような気がします。)、Access 2000 以降であれば、クエリーの SQL ビューに次のように記述すれば目的の抽出が可能です。
(テーブルを T_販売状況 としています。)

SELECT T3.製品番号, T3.日付, T3.MAXID, T4.販売状況
FROM T_販売状況 AS T4 INNER JOIN (
SELECT T1.製品番号, T1.日付, MAX(T1.ID) AS MAXID
FR...続きを読む

Qアクセス2010 最新データを抽出する方法

はじめまして。
アクセスを猛勉強中の初心者です。
過去記事を探しましたが、解決できませんでしたのでご教示お願いします。

やりたいことは、2つのテーブルからクエリを使って、最新のデータを抽出したいです。
ですが、その中に抽出したくないワードが存在します。
それ以外のワードで最新のデータを抽出したいです。

まず、下記のような2つのテーブルがあります。

●テーブル1       
・ID(主キー)      
・日付
・コメント
・顧客ID

●テーブル2
・顧客ID(主キー)
・顧客名
・住所

次にこのテーブルをクエリにしてデータを返すと、下記のようになります。

日付    コメント      顧客名   
・2/1     保留       Aさん
・2/1     発送       Bさん      
・2/1     相談       Cさん
・2/2    次回未定     Bさん
・2/3     発送       Aさん 
・2/4    次回未定     Dさん       

今回抽出したいデータは、「発送」というワードをはぶいた最新のデータをとりたいということです。
なので、データとしては、

日付    コメント      顧客名   
・2/1     保留       Aさん
・2/1     相談       Cさん
・2/2    次回未定     Bさん
・2/4    次回未定     Dさん

と、このように抽出したいのです。

最新データの抽出にはMax関数を使ってでき、いらないワードである「発送」はクエリのフィールドの抽出条件に『<>”発送”』と入力することで抽出を防ぐことができたのですが、これらの方法でMax関数を入れて最新データの抽出をしようとすると、全ての「発送」を除いたデータが抽出されるので、最新データに該当する顧客のデータが消えてしまいます。
なので、本来のコメントデータが分からない状態になります。

また、エクセル側でパラメータクエリを使って資料を作成し、アクセスに触ったことがない人たちが使用するので、アクセスを更新してといったことができません。
なので、更新クエリなどを使ってのやり方以外の方法はないでしょうか?

全くの初心者ですので、言葉足らずで説明が分かり辛くて申し訳ありません。
ご教示をお願いいたします。

はじめまして。
アクセスを猛勉強中の初心者です。
過去記事を探しましたが、解決できませんでしたのでご教示お願いします。

やりたいことは、2つのテーブルからクエリを使って、最新のデータを抽出したいです。
ですが、その中に抽出したくないワードが存在します。
それ以外のワードで最新のデータを抽出したいです。

まず、下記のような2つのテーブルがあります。

●テーブル1       
・ID(主キー)      
・日付
・コメント
・顧客ID

●テーブル2
・顧客ID(主キー)
・顧客名
・住所...続きを読む

Aベストアンサー

> 「発送」というワードをはぶいた最新のデータをとりたい

> 全ての「発送」を除いたデータが抽出される

日本語的には、その処理で合ってるように思いますが?



とりあえず、すっごく簡単に考えてみませんか?
選択クエリをソースにして、選択クエリを作れるのはご存知ですよね?

なので、「発送以外」を抽出する選択クエリを作りましょ。
で、コレを基に「最新日」を抽出する選択クエリを作りましょ。


もちろん一発でもいけますが、初めの内は上記で十分ですよ。
難しいことは慣れてからで十分です。

QAccess 各レコードの中での最大フィールドを抽出したい

Accessにつぎのようなテーブルがあります(例)。

各人の成績表

フィールド1:名前
フィールド2:1回目の得点
フィールド3:2回目の得点
フィールド4:3回目の得点

名前の重複はありません。
レコードごとに、フィールド2~4の最大値を抽出する方法を教えていただけると、たいへん幸せです。

どうぞ、よろしくお願いします。

Aベストアンサー

モジュールを作成し、その中に関数を作成します。
Function myMax(ParamArray a())
Dim i
myMax = -9999
For i = 0 To UBound(a())
If a(i) > myMax Then myMax = a(i)
Next
End Function

で、クエリに
最高点: myMax([n01],[n02],[n03])
というふうに関数を使えます。SQLでは
SELECT t8.name, t8.n01, t8.n02, t8.n03, myMax([n01],[n02],[n03]) AS 最高点 FROM t8;
となります。
頑張ってくださいヽ(^。^)ノ

QACCESS 重複データを1つだけ表示したい(初心者です)

ACCESSで複数のフィールドに全く同じレコードが複数存在します
(例)
フィールド1  フィールド2  フィールド3
愛知      田中      12
愛知      田中      12
愛知      田中      12
三重      山本      23
三重      山本      23
岐阜      鈴木      33
岐阜      鈴木      33

もともと他のデーターベースからCSVで落としたものをインポートしているので、データの存在自体はどうしようもありませんが、これらの重複しているデータを1件だけ表示したいのです。つまり
(例)
フィールド1  フィールド2  フィールド3
愛知      田中      12
三重      山本      23
岐阜      鈴木      33

どのようにすればよいでしょうか。

Aベストアンサー

クエリにて[固有のレコード]プロパティーを[はい]にします


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング