• 締切済み

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 というように作りたいのですが何かうまい方法はありませんでしょうか。 よろしくお願いします。  

みんなの回答

noname#112806
noname#112806
回答No.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)、… といった形で必要な数だけ名前のフィールドを作成すればご希望のものが出来上がるかと思います。 テーブル名、フィールド名等は適当に変更してください。 説明が下手なので分からないことが多々あるかと思いますが参考にしてみてください。

noname#112806
noname#112806
回答No.2

いろいろ考えてみましたが、クロス集計ではできないと思います。 レポート&イベントプロシージャならできそうな気がしますが…。 力になれなくてすみません。

vhb1953
質問者

お礼

お手数掛けして申し訳ありません。レポート&イベントプロシージャでの作成方法についてご教授いただければありがたいのですが。

noname#112806
noname#112806
回答No.1

いまいちテーブルの構造が分からないのですが、1つの名前に対して担当は3つと決まっているのでしょうか?

vhb1953
質問者

補足

ありがとうございます。担当は人によって違います。1から20ぐらいまであります。