- 締切済み
ACCESSのクロス集計クエリを使って・・・・
クロス集計クエリを使って次のようなことは可能でしょうか。 テーブル 名前1 担当1 担当2 担当3 名前2 担当2 担当3 担当4 名前3 担当3 担当4 担当5 クロス集計の結果 担当1 名前1 担当2 名前1 名前2 担当3 名前2 名前3 担当4 名前3 名前4 担当5 名前5 というように作りたいのですが何かうまい方法はありませんでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
たびたびすみません。 1つの担当に対する名前の数も不定なんですよね? 1つ名案が浮かびましたので参考までに… まず、テーブルを3つに分けます。 T_担当 担当ID(主キー)、担当名 T_名前 名前ID(主キー)、名前 T_統合 統合ID(主キー)、名前ID、担当ID 次に標準モジュール内に以下の関数を作成します。 Function GetName(TantouID As Long, Number As Long) As String Dim dbs As DAO.Database Dim rst As DAO.Recordset Dim SQL As String Dim RecCnt As Long Dim i As Integer Dim Namelist As Variant SQL = "SELECT 名前 FROM ((T_統合 INNER JOIN T_名前 ON T_統合.名前ID=T_名前.名前ID) INNER JOIN T_担当 ON T_統合.担当ID=T_担当.担当ID) WHERE T_統合.担当ID=" & TantouID & " ORDER BY T_統合.名前ID" Set dbs = CurrentDb Set rst = dbs.OpenRecordset(SQL) If rst.BOF And rst.EOF Then GetName = "" Else rst.MoveLast RecCnt = rst.RecordCount rst.MoveFirst ReDim Namelist(RecCnt - 1) As String For i = 0 To RecCnt - 1 Namelist(i) = rst!名前 rst.MoveNext Next If UBound(Namelist) < Number - 1 Then GetName = "" Else GetName = Namelist(Number - 1) End If End If End Function 最後にクエリを作成します。 基になるテーブルはT_担当でフィールドは 担当者名、名前1: GetName([担当ID],1)、名前2: GetName([担当ID],2)、名前3: GetName([担当ID],3)、… といった形で必要な数だけ名前のフィールドを作成すればご希望のものが出来上がるかと思います。 テーブル名、フィールド名等は適当に変更してください。 説明が下手なので分からないことが多々あるかと思いますが参考にしてみてください。
いろいろ考えてみましたが、クロス集計ではできないと思います。 レポート&イベントプロシージャならできそうな気がしますが…。 力になれなくてすみません。
いまいちテーブルの構造が分からないのですが、1つの名前に対して担当は3つと決まっているのでしょうか?
補足
ありがとうございます。担当は人によって違います。1から20ぐらいまであります。
お礼
お手数掛けして申し訳ありません。レポート&イベントプロシージャでの作成方法についてご教授いただければありがたいのですが。