こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

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
------------------------------------------

現状のクエリですと古い日時のデータを引っ張り出してきてしまい、
困っています。。。

どのようなクエリを組めば最新日時のデータを取得できるように
なりますでしょうか。
ご教示いただけますと幸いです。

投稿日時 - 2016-01-03 17:29:11

QNo.9105474

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(6)

ANo.6

これでどうでしょうか。
SELECT [テーブル].社員, [テーブル].売上日時, [テーブル].売上金額
FROM(SELECT [テーブル].社員, Max([テーブル].売上日時) AS 売上日時の最大
FROM テーブル
GROUP BY [テーブル].社員) as Q INNER JOIN テーブル ON ([Q].売上日時の最大 = [テーブル].売上日時) AND ([Q].社員 = [テーブル].社員);

上記をクエリのSQLに貼り付け後、デザインで見るとこんな感じです。
要するに、社員をグループ化して売上日時の最大を取得するクエリ(Q)に
当該テーブルを紐付けてます。

投稿日時 - 2016-01-04 16:48:24

-広告-

ANo.5

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

投稿日時 - 2016-01-03 20:18:27

ANo.4

訂正:

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

投稿日時 - 2016-01-03 20:00:26

ANo.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
日付のデータ型が、もし文字列型である場合は、日付文字列の大小が暦的に大小(前後)と一致するか注意して考えるてみること。

投稿日時 - 2016-01-03 19:51:11

ANo.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

まあ、邪道といえば邪道。が、簡単といえば簡単。そんな回答です。

投稿日時 - 2016-01-03 19:48:26

ANo.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ビューに張り付け(テーブルの名前は変える必要があります)、クエリのデザインビューに戻せば普通のクエリビルダでどう作っているのかわかります。

投稿日時 - 2016-01-03 18:50:41

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-