縦持ちデータを横持ちデータに変換する

 横持ちデータを縦持ちデータに変換するケース(詳しくはこちらを参照のこと)の逆バージョンです。どちらも単なる行列の転置とは異なりますので注意してください。
 基本的にクロス集計クエリ(SQLでいうTransform句)を用いて対応することとなります。クエリによるものとはいえ横持ちにするという発想自体を好まない方もいるかもしれませんが、ニーズは決して低くはないので覚えておいて損はないと思います。

横並びにしようとするデータが連番で整理されている場合

f:id:accs2014:20160809235138p:plain:right:w300

 具体的な例として右のようなテーブルを用いるものとします。氏名ごとに、その趣味を横並びにするというわけです。
 連番をそのまま列見出しとして使うことができるため、最も扱いやすいケースです。


f:id:accs2014:20160809235139p:plain:right:w400

 クロス集計クエリウイザードを使い、行見出しを「氏名」、列見出しを「趣味連番」とします。
 集計の対象となる列は当然「趣味」となりますが、趣味の名称がそのまま表示されるように集計方法を「先頭」とします(実際「カウント」以外は大丈夫です)。
 また、「集計値を表示する」は不要ですのでチェックを外します。


f:id:accs2014:20160809235140p:plain:right:w400

 データシートビューです。
 

横並びにしようとするデータが連番以外の数値で整理されている場合

f:id:accs2014:20160809235141p:plain:right:w300

 具体的な例として右のようなテーブルを用いるものとします。
 横並びにしようとするデータ(趣味)がコードで整理されている例ですが、クロス集計クエリウイザードでこのコードをそのまま列見出しとして使うとスカスカのクエリ(本来のクロス表ですが)になってしまいますので、連番を算出する必要があります。


f:id:accs2014:20160809235142p:plain:right:w400

 具体的な方法ですが、テーブルをもとにクエリを作り、Dcount関数を用いて氏名,趣味コードからを連番を算出します。
 連番となる列には次のような式を入力します。

趣味連番: DCount("*","会員趣味テーブルB","氏名='" & [氏名] & "' and 趣味コード <=" & [趣味コード])


f:id:accs2014:20160809235143p:plain:right:w400

 データシートビューです。
 このクエリをもとに、上記の例と同じようにクロス集計クエリウイザードを設定すれば上記の例と同じような横持ちデータが得られます。
 なお、サブクエリを使えばクエリは1個で済みますので知識のある方はチャレンジしてみてください。

 注意点ですが、並び順は趣味コードに基づくものとなりますので上記の例と全く同一のデータにはなりません。
 また、1つの名前に対して同一の趣味が複数記録されている場合、Dcount関数によって同一の連番が付与されます。そのデータをもとにクロス集計クエリを作成すると、同一人物の同一の趣味は1回しか表示されません。つまりデータの数が減ってしまいます。この例の場合は(同一人物の同一の趣味を2回以上表示しても意味がないので)問題なさそうですが、データの性質によっては問題となりえます。


横並びにしようとするデータが数値で整理されていない場合

f:id:accs2014:20160809235144p:plain:right:w300

 具体的な例として右のようなテーブルを用いるものとします。
 趣味に番号がないので戸惑うかもしれませんが、仕方ありませんのでテキスト型である「趣味」列に基づき連番を算出してしまいましょう。


f:id:accs2014:20160809235145p:plain:right:w400

 クエリを作り、Dcount関数を用いて氏名,趣味からを連番を算出します。
 式は次のようになります。

趣味連番: DCount("*","会員趣味テーブルC","氏名='" & [氏名] & "' and 趣味 <='" & [趣味] & "'")


f:id:accs2014:20160809235146p:plain:right:w400

 データシートビューです。
 このクエリをもとに、上記の例と同じようにクロス集計クエリウイザードを設定すれば最初の例と同じような横持ちデータが得られます。
 なお、サブクエリを使えばクエリを減らせる点、並び順が「趣味」列の並び順に沿ったものとなる点、同一人物の同一の趣味が1回しか表示されない点については1つ上の例と同じです。