• 締切済み

Accessで最新データを取得する方法

Accessで最新日時のデータを取得できるクエリを作りたいです。 例えば以下のようなデータを、、、 ------------------------------------------ 社員  売上日時  売上金額 Aさん  2015/12/10 50,000 Aさん  2015/12/25 35,000 Bさん  2015/12/15 40,000 Bさん  2015/12/28 60,000 Cさん  2015/12/13 90,000 Cさん  2015/12/28 50,000 ------------------------------------------ 以下のようにして取得したいです。 ------------------------------------------ 社員  売上日時  売上金額 Aさん  2015/12/25 35,000 Bさん  2015/12/28 60,000 Cさん  2015/12/28 50,000 ------------------------------------------ 現状のクエリですと古い日時のデータを引っ張り出してきてしまい、 困っています。。。 どのようなクエリを組めば最新日時のデータを取得できるように なりますでしょうか。 ご教示いただけますと幸いです。

みんなの回答

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.6

これでどうでしょうか。 SELECT [テーブル].社員, [テーブル].売上日時, [テーブル].売上金額 FROM(SELECT [テーブル].社員, Max([テーブル].売上日時) AS 売上日時の最大 FROM テーブル GROUP BY [テーブル].社員) as Q INNER JOIN テーブル ON ([Q].売上日時の最大 = [テーブル].売上日時) AND ([Q].社員 = [テーブル].社員); 上記をクエリのSQLに貼り付け後、デザインで見るとこんな感じです。 要するに、社員をグループ化して売上日時の最大を取得するクエリ(Q)に 当該テーブルを紐付けてます。

  • panacon
  • ベストアンサー率31% (214/679)
回答No.5

mamason さんへ 私のほうはすらすらとSQLを書くことが出来ないので、szo_orz さんの回答された方法を選択しますが、クエリの集計のグループ化のクエリを作って、元のテーブルに社員と日付の両方で接続します。

回答No.4

訂正: X 残念なことにWHERE節を指定できません。 O 残念なことにORDER BY 句を指定できません。

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

http://www.wanichan.com/pc/access/2010/5/20.html に、本質問とそっくりな例の解説があるのでは。 >最新日時のデータ は、アクセスの日付のデータが、中身的には「整数」(時刻がついておれば小数点数となる)日付順序の整数で持っているので、「最近とは」最大整数のデータ行を求めることと同じになる。 その場合、各社員1人の中での限定で考えるべきなので、そういうように考えるのが、(SQLなどよか、他のデータベース言語でも)「グループ化」といわれる。 Googleで「SQL グループ化」「アクセス グループ化」で照会して勉強のこと。 参考 http://kaya-soft.com/sqlserver2008-toranomaki/beginner/groupby/ SQLはアクセスのクエリと基本的に同等の機能だからね。 参考 https://support.microsoft.com/ja-jp/kb/210276 日付のデータ型が、もし文字列型である場合は、日付文字列の大小が暦的に大小(前後)と一致するか注意して考えるてみること。

回答No.2

【邪道といえば邪道。が、簡単といえば簡単】 SELECT  DISTINCT 社員,  DBLookup("SELECT 売上日時 ・・・ 売上日時 DESC") AS 売上日時,  DBLookup("SELECT 売上金額 ・・・ 売上日時 DESC") AS 売上金額 FROM 売上履歴 ORDER BY 社員; DLookup()内のSQL文は次のようです。 SQL文1="SELECT 売上日時 FROM 売上履歴 WHERE 社員='" & [社員] & "' ORDER BY 売上日時 DESC" SQL文2="SELECT 売上金額 FROM 売上履歴 WHERE 社員='" & [社員] & "' ORDER BY 売上日時 DESC" 要は、 SELECT DISTINCT 社員 FROM 売上履歴 ORDER BY 社員; というSQL文の実行結果 =================================== Aさん Bさん Cさん =================================== に、該当する売上日時と売上金額とをアペンドして結果を得ようというものです。さて、その場合に真っ先に思いつくのがDLookup()ですが、残念なことにWHERE節を指定できません。そこで、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 = 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 まあ、邪道といえば邪道。が、簡単といえば簡単。そんな回答です。

noname#231195
noname#231195
回答No.1

2段階に分けて2つクエリを作るといいです。 ところで同じ日の同じ社員のレコードが複数あるということはないでしょうね? もしあるなら、どちらを表示させるのかわからないので、なんともクエリを作りかねます。 以下は、同じ日の同じ社員のレコードはただ一つである、という前提で書きます。 第一段階は、社員でグループ化して売り上げ日時の最大値をとるクエリを作ります(ここでは仮に名前をqryx01とします)。集計クエリと呼ばれる種類のクエリになります。 この説明でどんなクエリかイメージできなければ、クエリの表示をSQLにして以下のSQLを張り付けてください。テーブルの名前はtblX01としてあります。 SELECT tblX01.社員, Max([tblX01].[売上日時]) AS 売上日時 FROM tblX01 GROUP BY tblX01.社員; 第二のクエリ(qryx02)は、第一のクエリ(qryx01)にある社員と売り上げ日時の組み合わせと同じレコードを元のテーブル(tblX01)から引っ張ってきます。 SQLならこんな風になります。 SELECT qryx01.社員, qryx01.売上日時, tblX01.売上金額 FROM tblX01 INNER JOIN qryx01 ON (tblX01.売上日時 = qryx01.売上日時) AND (tblX01.社員 = qryx01.社員); SQLビューについてはこの↓ページに「AccessでSQL文の表示」というタイトルで四角にかこった場所にどう切り替えるのか書いてあります。2007以降でも同じところにあります。 http://www.ikari24.com/db/access2.html 私の張り付けたSQLをお手元のデーターベースでSQLビューに張り付け(テーブルの名前は変える必要があります)、クエリのデザインビューに戻せば普通のクエリビルダでどう作っているのかわかります。

関連するQ&A