- ベストアンサー
アクセスのクロス集計の同一データの抽出について
アクセスのクロス集計でデータを整理しようとしていますが、うまくいかないのでご教授願います。 テーブルで以下のようなデータを使用しています。 社員番号 社員 転勤年月日 転勤場所 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 横浜市 抽出の仕方をお教えください。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なぜクロス集計? 記事を読んでも何を列にするつもりなのかが書かれていませんね 単なる抽出クエリでいいんじゃないの 抽出クエリで転勤年月日の抽出条件欄に In (select max(転勤年月日) from テーブル名 as A where A.社員番号=テーブル名.社員番号)
その他の回答 (2)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>回答の抽出条件ですと、テーブル全体の転勤年月日で最新のデータで >抽出されるのですね。 違います。お望みのものが得られます >なにぶんアクセス初心者なので、 だったら思い込みだけで判断せず、アドバイスを受けたら一度はやってみなきゃ で、理由を考える。分からなければ質問する そうでなきゃ実力はアップしませんよ
お礼
失礼な質問だったみたいですね。 気がつかなくて申し訳ございませんでした。 アドバイスのとおりでよかったのですね。 何か足りないところがあったのでしょう。 再度、確認の上、分からないところがあったらまた質問します。 最後に、おっしゃることはもっともですね。 自分で考え、実践しないと実力はアップしません。 ありがとうございました。
クエリの回答は最後に書いております。 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文に対する馴れみたいなものが要求されると思います。 よって、私は、後任スタッフの事を考えて大概が前者で済ましています。
お礼
お礼が遅れて大変失礼しました。 アクセス初心者なので、ちょととんちんかな質問もあり お答えいただきありがとうございました。 大変参考となりました。
お礼
今、別のデータを作って試しにやってみたら 希望どおりのデータが抽出出来ました!!! ただ、職場のデータは膨大な量から抽出するものですから、 後でうまくいかなかった原因を検証したいと思います。 失礼な返事をして、申し訳なかったと思います。 本当にありがとうございました。
補足
回答ありがとうございました。 失礼しました。質問が不十分でわかりづらいかったですね。 回答の抽出条件ですと、テーブル全体の転勤年月日で最新のデータで 抽出されるのですね。 私がつくろうとしている抽出クエリは、以下のとおりです。 社員番号 社員 転勤年月日 転勤場所 1 A H19.1.1 横浜市 2 B H18.5.1 浦和市 3 C H19.4.1 船橋市 各社員番号ごとに最新転勤年月日で抽出したかったのです。 クロス集計は、クエリの集計で、転勤年月日を“最新”の条件で、 社員番号を“グループ化”で集計しようとしたのですが、 転勤場所の抽出条件については、どんな条件で集計すればよいのか 分からなかったのです。 なにぶんアクセス初心者なので、よろしくお願いします。