• ベストアンサー

アクセスのクロス集計の同一データの抽出について

アクセスのクロス集計でデータを整理しようとしていますが、うまくいかないのでご教授願います。 テーブルで以下のようなデータを使用しています。 社員番号 社員 転勤年月日 転勤場所 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 横浜市 抽出の仕方をお教えください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

なぜクロス集計? 記事を読んでも何を列にするつもりなのかが書かれていませんね 単なる抽出クエリでいいんじゃないの 抽出クエリで転勤年月日の抽出条件欄に In (select max(転勤年月日) from テーブル名 as A where A.社員番号=テーブル名.社員番号)

LEOrio
質問者

お礼

今、別のデータを作って試しにやってみたら 希望どおりのデータが抽出出来ました!!! ただ、職場のデータは膨大な量から抽出するものですから、 後でうまくいかなかった原因を検証したいと思います。 失礼な返事をして、申し訳なかったと思います。 本当にありがとうございました。

LEOrio
質問者

補足

回答ありがとうございました。 失礼しました。質問が不十分でわかりづらいかったですね。 回答の抽出条件ですと、テーブル全体の転勤年月日で最新のデータで 抽出されるのですね。 私がつくろうとしている抽出クエリは、以下のとおりです。 社員番号 社員 転勤年月日 転勤場所 1        A  H19.1.1    横浜市 2        B  H18.5.1   浦和市 3        C  H19.4.1   船橋市 各社員番号ごとに最新転勤年月日で抽出したかったのです。 クロス集計は、クエリの集計で、転勤年月日を“最新”の条件で、 社員番号を“グループ化”で集計しようとしたのですが、 転勤場所の抽出条件については、どんな条件で集計すればよいのか 分からなかったのです。 なにぶんアクセス初心者なので、よろしくお願いします。

その他の回答 (2)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

>回答の抽出条件ですと、テーブル全体の転勤年月日で最新のデータで >抽出されるのですね。 違います。お望みのものが得られます >なにぶんアクセス初心者なので、 だったら思い込みだけで判断せず、アドバイスを受けたら一度はやってみなきゃ で、理由を考える。分からなければ質問する そうでなきゃ実力はアップしませんよ

LEOrio
質問者

お礼

失礼な質問だったみたいですね。 気がつかなくて申し訳ございませんでした。 アドバイスのとおりでよかったのですね。 何か足りないところがあったのでしょう。 再度、確認の上、分からないところがあったらまた質問します。 最後に、おっしゃることはもっともですね。 自分で考え、実践しないと実力はアップしません。 ありがとうございました。

noname#140971
noname#140971
回答No.1

クエリの回答は最後に書いております。 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文に対する馴れみたいなものが要求されると思います。 よって、私は、後任スタッフの事を考えて大概が前者で済ましています。

LEOrio
質問者

お礼

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

関連するQ&A

  • Accessのクロス集計

    データテーブル 地域コード 年  データ 12204   2002   70 12204   2003  70 12204   2004  70 12205   2002  100 12205   2003  100 12205   2004  100 12206   2002  50 12206   2003  50 12206   2004  50 地域テーブル 地域コード 市名  合併情報 12202   松戸市 12203   市川市   12204   野田市   12205    柏市   沼南町(沼南町は柏市は合併しましたという意味) 12206   昭南町 作成したいクロス集計表 市名  2002 2003 2004 野田市  70  70  70 柏市  150  150  150 沼南町 50  50  50 市名と年 のクロス集計で もし地域テーブルに合併情報があれば (上記の場合 柏市(100)+昭南町(50)) それを反映させて集計するという形を作りたいのですが クロス集計クエリを作るときの抽出条件に記述すればいいのか、それとも1からコードを記述しなければならないか どうやって作ったらいいかよくわかりません。 説明がちょっとわかりづらいのですが もしわかるかたがいらしたら抽出条件式やコードなど詳しく教えていただけないでしょうか よろしくお願いいたします。

  • Accessのクロス集計

    Acceessでクロス集計クエリを元にフォームをつくり、コンボボックスで選択した商品だけを表示するにはどうしたらよいですか。 選択クエリを元にしたものはWhere条件式を使い抽出できたのですが、 クロス集計のものだと出来ません。 宜しくお願い致します。  

  • access2003 クロス集計クエリに抽出条件を設定する

    QNo.3495024にて、「取引先ごとの月次売上(部品別および合計)」をフォーム形式で表示する方法を質問した者です。 1)クロス集計クエリの抽出条件としてこのコンボを設定 2)フォームに置いたボタンでクロス集計クエリまたはそれをソースにした別フォームを開く という方法を教えていただきました。 昨夜から自分なりに調べましたが、1)のクロス集計クエリに抽出条件を設定する方法がわかりません。 昨日の今日で再質問も気が引けますが、時間がないので質問させてください! ご存知の方、よろしくお願いいたします。

  • Access データ抽出および集計の方法

    Access2016を使って下記データ抽出および集計をしたいのです。 テーブルA 商品CD 契約日 会社CD テーブルB 会社CD 契約期間開始日 契約期間終了日 テーブルC 商品CD 商品種別 テーブルAとテーブルCの商品CDをリレーション テーブルAとテーブルBの会社CDをリレーション 集計したいデータ 契約日が期間開始日~期間終了日に含まれるテーブルAのデータを抽出したいです。 これが取れれば、クロス集計で会社CD毎の商品種別の数を最終的に計算します。 期間開始日~期間終了日はそれぞれの会社CD毎に違います。 また、同じ会社CDに開始日~終了日以外の日付データも含まれています。 このような抽出はできないでしょうか?

  • Access 2003、2007 なぜクロス集計クエリだけクエリパラメータを設定しないといけないのか?

    Accessで、なぜクロス集計クエリだけクエリパラメータを設定しないといけないのでしょうか? 普通の選択クエリなどでパラメータクエリを作る時は抽出条件に[ ]を記入するだけで作成できますが、クロス集計クエリでパラメータクエリを作ろうとすれば、クエリパラメータでダイアログボックスの文字列とデータ型を指定しなければいけません。 これはなぜなのでしょうか?

  • Accessフォームにクロス集計クエリを表示させるとき

    Accessフォームにクロス集計クエリを表示させようとしています。 クロス集計の横軸の項目数が増減するようなデータを扱っているのですが、 クエリをフォームに貼り付けてフォームを保存した後、クロス集計の横軸の項目数が増減しても、フォーム上の横軸の数は増減してくれません。 もう少し具体的に書くと、 クロス集計クエリは、縦軸に日付、横軸に社員を設定し、日付別の社員のアクセス回数カウントを表示するもので、社員は新しく入ってきたり、辞めていったりするため増減します。 フォーム上に集計クエリを貼り付けて、次のような表ができました。 ----- 日付 アクセス計 社員A 社員B ○日 3     1   2 △日 4     1   3 ----- □日に、StaffCが増えたので、次の様にしたいのですが、StaffCの列が表示されません。 ----- 日付 アクセス計 社員A 社員B 社員C ○日 3     1   2 △日 4     1   3 □日 5     1   2   2 ----- どのような解決方法がありますか? 質問が分かりづらいと思いますが、宜しくお願いします。表は等幅フォントで見ていただければと思います。

  • ACCESS  クロス集計クエリの抽出条件について

    http://www.accessclub.jp/samplefile/samplefile_39.htm 上記サイトのクロス集計クエリのやり方で、抽出条件を Between [Forms]![フォーム1]![開始日] And [Forms]![フォーム2]![終了日] とする場合、 クエリパラメータダイアログにはどう記述したらよいのでしょうか? [Forms]![フォーム1]![開始日]と[Forms]![フォーム2]![終了日]をそれぞれ別々にテキスト型としてもエラーですし、(「式が複雑です」とのエラー) 条件を全て記述しても、「かっこの使い方が正しくありません。」とのエラーです。 何が間違っているのでしょうか?

  • クロス集計されたデータを元に戻すには?

    表題の通り、クロス集計されたデータを元に戻す方法を探しています。 現在あるシステムにおいて出力されるデータが以下の様な形式だったとします。 (このデータ出力形式は変更が出来ないものとします。) ■元のデータ形式 時刻, A, B, C, D, 1:00, 1, 2, 3, 4, 2:00, 2, 3, 4, 5, 3:00, 3, 4, 5, 6, 4:00, 4, 5, 6, 7, .... ■目標とするデータ形式 時刻, 分類, 値, 1:00, A, 1, 1:00, B, 2, 1:00, C, 3, 1:00, D, 4, 2:00, A, 2, 2:00, B, 3, 2:00, C, 4, 2:00, D, 5, ... ※フォントがずれるので見辛いかもしれませんがご理解願います。 なお時刻はここでは1:00~24:00までの24個 分類項目は特定の個数 (ここではx個あるとします) データを保存、集計するうえで、クロス集計されているデータ形式は非常に使いにくく、 何とかして目標とする形に変換したいと考えております。 どなたか良い変換方法をご存知でしょうか? またデータベースの基本的な考え方として、やはりテーブルのデータ構造は 今回目標とする様な構造が良いのでしょうか? 一応ある程度データベースを知っている人の意見で今回の変換を考えたのですが、 処理をする上で理想的な構造とはどういったものでしょうか?

  • エクセルのクロス集計について

    現在、仕事でアンケートのクロス集計をしております。 入力データはオートフィルターをかけおり、単純集計の際は、 質問の回答別に「Count If」の関数を使って、集計しました。 例えば、質問1に「A」と答え、質問2では「B」と答えた人という、 条件でフィルタを書けることはできるのですが、その数字を、 数える方法はあるのでしょうか。 オートフィルタをかけると、「Count If」が使えなくて・・・・。 現在、手作業で数えており、苦戦しております。

  • Access2003 クロス集計で集計値を四捨五入

    ☆以下のようなテーブルで、フィールド[ID]~[点数]があり、文字および数字のデータが混在しています。   ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓ =========================================== (テーブル(1)) [ID]  [クラス]  [科目]  [点数]     1     A     英語    11    2     B     英語    22    3     C     数学    33    4     A     国語    44   5     B     数学    55    6     C     国語    66    7     B     国語    77   8     C     英語    88     9     A     数学    99     =========================================== ☆上記のテーブルをクロス集計クエリで集計する ・フィールド[クラス]を行見出しに設定、 ・フィールド[科目]を列見出しに設定、 ・フィールド[点数]を集計する項目にし主計方法を「合計」に設定する。 =========================================== [クロス集計結果]   合計   英語  国語  数学       A  154   11    44    99        B  154   22    88    55     C  187   99    77    33  =========================================== [課題] クロス集計クエリで、集計値を四捨五入する (1) フィールド[クラス]を行見出しに設定、    フィールド[科目]を列見出しに設定、    フィールド[点数]を集計する項目にし主計方法を「合計」に設定する。 (2) クロス集計の値を、下1桁で四捨五入した値を表示する。   (3) 「合計」の値を、下1桁で四捨五入した値を表示する。 ※ クロス集計した合計値を、四捨五入した値を表示する   ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓ =========================================== [クロス集計結果]   合計   英語  国語  数学     A  150   10    40   100        B  150   20    80    60     C  190   90    70    30  ===========================================   ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑    上記のように、クロス集計クエリでの集計値を四捨五入して 表示させたいのですが、どうすればよろしいでしょうか? また、クエリだけでは出来ない場合は、SQLで教えていただければ 幸いでございます。 お手数お掛けしますが、何とぞ宜しくお願い致します。

専門家に質問してみよう