重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

アクセスのクロス集計でデータを整理しようとしていますが、うまくいかないのでご教授願います。
テーブルで以下のようなデータを使用しています。

社員番号 社員 転勤年月日 転勤場所
1  A  H19.1.1 横浜市
1     A  H18.4.1 船橋市
2     B  H18.5.1  浦和市
3     C  H19.4.1  船橋市
2     B  H17.4.1  船橋市
3     C  H18.1.1  横浜市

このデータをクロス集計で最新の転勤年月日のみを抽出しようとしたところ、うまくいきません。抽出の条件は、社員番号、社員でグループ化し、転勤年月日を最新にしたところ、転勤場所でも条件を指定しなければならず思うようにいきません。当方としては、転勤年月日と同じ行の転勤場所を抽出したいのです。条件を指定すると、その条件に合ったものが抽出され、転勤年月日と関係のない転勤場所が抽出されてしまいます。
抽出例:Aさんの場合 H19.1.1 横浜市

抽出の仕方をお教えください。よろしくお願いします。

A 回答 (3件)

なぜクロス集計?


記事を読んでも何を列にするつもりなのかが書かれていませんね
単なる抽出クエリでいいんじゃないの

抽出クエリで転勤年月日の抽出条件欄に

In (select max(転勤年月日) from テーブル名 as A where A.社員番号=テーブル名.社員番号)

この回答への補足

回答ありがとうございました。
失礼しました。質問が不十分でわかりづらいかったですね。
回答の抽出条件ですと、テーブル全体の転勤年月日で最新のデータで
抽出されるのですね。

私がつくろうとしている抽出クエリは、以下のとおりです。

社員番号 社員 転勤年月日 転勤場所
1        A  H19.1.1    横浜市
2        B  H18.5.1   浦和市
3        C  H19.4.1   船橋市

各社員番号ごとに最新転勤年月日で抽出したかったのです。
クロス集計は、クエリの集計で、転勤年月日を“最新”の条件で、
社員番号を“グループ化”で集計しようとしたのですが、
転勤場所の抽出条件については、どんな条件で集計すればよいのか
分からなかったのです。

なにぶんアクセス初心者なので、よろしくお願いします。

補足日時:2007/09/14 02:38
    • good
    • 0
この回答へのお礼

今、別のデータを作って試しにやってみたら
希望どおりのデータが抽出出来ました!!!

ただ、職場のデータは膨大な量から抽出するものですから、
後でうまくいかなかった原因を検証したいと思います。

失礼な返事をして、申し訳なかったと思います。
本当にありがとうございました。

お礼日時:2007/09/15 01:04

>回答の抽出条件ですと、テーブル全体の転勤年月日で最新のデータで


>抽出されるのですね。
違います。お望みのものが得られます

>なにぶんアクセス初心者なので、
だったら思い込みだけで判断せず、アドバイスを受けたら一度はやってみなきゃ
で、理由を考える。分からなければ質問する
そうでなきゃ実力はアップしませんよ
    • good
    • 0
この回答へのお礼

失礼な質問だったみたいですね。
気がつかなくて申し訳ございませんでした。

アドバイスのとおりでよかったのですね。
何か足りないところがあったのでしょう。
再度、確認の上、分からないところがあったらまた質問します。

最後に、おっしゃることはもっともですね。
自分で考え、実践しないと実力はアップしません。

ありがとうございました。

お礼日時:2007/09/15 00:38

クエリの回答は最後に書いております。



ID__社員番号____社員___転勤年月日____転勤場所
1_____________1_________A___2004/01/01___横浜市
2_____________1_________A___2003/04/01___船橋市
3_____________2_________B___2003/05/01___浦和市
4_____________3_________C___2004/04/01___船橋市
5_____________2_________B___2002/04/01___船橋市
6_____________3_________C___2005/01/01___横浜市

<tab2 クエリ>
社員番号__社員___最新転勤年月日__転勤場所
__________1______A____2004/01/01_______横浜市
__________2______B____2003/05/01_______浦和市
__________3______C____2005/01/01_______横浜市

《DBLookup関数で逃げる方式》

SELECT DISTINCT 社員番号,
DBLookup("社員","tab2","社員番号=" & 社員番号) AS 社員,
DBLookup("Max(転勤年月日)","tab2","社員番号=" & 社員番号) AS 最新転勤年月日,
DBLookup("転勤場所","tab2","社員番号=" & 社員番号 & " AND 転勤年月日=#" & 最新転勤年月日 & "#") AS 転勤場所
FROM tab2
ORDER BY 社員番号;

社員番号を DISTINCT で一つだけ抽出し、対応する[社員]、[転勤年月日]、[転勤場所]をDBLookup関数で抽出しています。

Public Function DBLookup(ByVal strField As String, _
             ByVal strTable As String, _
             Optional ByVal strWhere As String = "", _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
   Dim DataValue
   Dim strQuerySQL As String
   Dim rst     As ADODB.Recordset

   Set rst = New ADODB.Recordset
   strQuerySQL = "SELECT " & strField & " FROM " & strTable
   If Len(strWhere) > 0 Then
     strQuerySQL = strQuerySQL & " WHERE " & strWhere
   End If
   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

《クエリをちゃんと作る方式》

SELECT tab2.社員番号, tab2.社員, tab2.転勤年月日, tab2.転勤場所
FROM
[SELECT 社員番号, MAX(転勤年月日) AS 最新転勤年月日 FROM tab2 GROUP BY 社員番号]. AS tab3
LEFT JOIN tab2
ON (tab3.社員番号=tab2.社員番号) AND (tab3.最新転勤年月日=tab2.転勤年月日);

実行結果は、双方とも同じです。

《DBLookup関数で逃げる方式》と《クエリをちゃんと作る方式》とをどちらを採用するかは好みの問題かと思います。
ただ、前者は誰でも可能、後者はSQL文に対する馴れみたいなものが要求されると思います。
よって、私は、後任スタッフの事を考えて大概が前者で済ましています。
    • good
    • 0
この回答へのお礼

お礼が遅れて大変失礼しました。
アクセス初心者なので、ちょととんちんかな質問もあり
お答えいただきありがとうございました。
大変参考となりました。

お礼日時:2007/09/27 22:09

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