縦持ち・横持ちの変換、クロス集計、行列の入れ替えの違い

 「縦に並んだテーブルのデータを横並びにしてほしい」と言われて行列を入れ替えたデータを作ってみたら、そうではなくて縦持ちのデータを横持ちに変換をしてほしいのだ、と言われることがあります。こうした混乱を避けるために用語を整理しておく必要があります。

縦持ち・横持ちの変換

 縦持ちのデータの例として次のような表が挙げられます。
 正規化されているテーブルはこのような構造となります。なにかと縦長になるので人間にとってわかりやすい形とはいえませんが、データベースとしては扱いやすい構造です。

氏名趣味
井上 文子囲碁
井上 文子七宝焼き
井上 文子テニス
山田 啓司俳句
山田 啓司囲碁
山田 啓司ゴルフ
山田 啓司釣り
武田 文博カメラ
武田 文博釣り
武田 文博ゴルフ
鈴木 泰将棋
鈴木 泰テニス

 横持ちのデータの例として次のような表が挙げられます。
 正規化されていない構造であり、データの内容に応じて(趣味が多い人がいる場合)列を追加しなければならないことがあること、空白となる領域が多くなりがちなこと、集計の際に多数の列を参照しなければならないことなど、データベースとしては扱いにくいですが、人間の目には見やすい形であり、用途によっては珍しくはありません。

氏名趣味1趣味2趣味3趣味4
井上 文子囲碁七宝焼きテニス
山田 啓司俳句囲碁ゴルフ釣り
武田 文博カメラ釣りゴルフ
鈴木 泰将棋テニス

 この例からわかるように、縦持ちデータを横持ちデータにするという場合、通常はある項目(この例では氏名)でグループ化するという要素を含んでおり、単に縦横(行列)を入れ替えるのとは区別する必要があります。

クロス集計

 クロス集計の例として次のような表が挙げられます。
 列の1つ1つが固有の値(趣味)に対応していますので、横持ちデータと違ってデータが左詰めされません。データの加工が難しいため通常はこういう形のテーブルが作られることはなく、クエリとして作成されます。

氏名囲碁将棋俳句七宝焼きゴルフテニス釣りカメラ
井上 文子111
山田 啓司1111
武田 文博111
鈴木 泰11

行列の入れ替え

 最初に挙げた縦持ちデータを再掲します。

氏名趣味
井上 文子囲碁
井上 文子七宝焼き
井上 文子テニス
山田 啓司俳句
山田 啓司囲碁
山田 啓司ゴルフ
山田 啓司釣り
武田 文博カメラ
武田 文博釣り
武田 文博ゴルフ
鈴木 泰将棋
鈴木 泰テニス

 この行列を入れ替えた結果、つまり単純に縦横を入れ替えた結果は次のようになります。
 ほとんど実用性のない形なのでこのようなテーブルが作られることはまずありませんが、(上記の横持ちの形にしてほしいつもりが)「データを横に並べてほしい」などと依頼してしまうと、このような結果で返ってくることを覚悟しなければなりません。

氏名趣味1氏名趣味2氏名趣味3氏名趣味4氏名趣味10氏名趣味11氏名趣味12
井上 文子井上 文子井上 文子山田 啓司武田 文博鈴木 泰鈴木 泰
囲碁七宝焼きテニス俳句ゴルフ将棋テニス