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

聊か唐突ではあるけれども、SQLについてのメモ。

縦持ちのデータを横持ちのデータに変換するSQL。
やり方を知って、案外簡単なことにちょっと感心したので、備忘のために書き付けておく。
何のことだかさっぱり判らないという方は、EXCELの「形式を選択して貼り付け」→「行列を入れ替える」と似たようなものだと思えばイメージを摑みやすいかもしれない。もとより「かもしれない」程度の例えだが。
もっとも、SQLを知らなかったからと言って日常生活に差し支える恐れは一切ないから、イメージが摑めなくても何の問題もないことは言うまでもないし、もし摑めたとしてもどうということもない。

たとえば、こんなデータがあるとする。

[SAMPLE_tbl]TBL
Sales_NoLine_NoSell_Item
00011いちご
00012みかん
00013なし
00014りんご
00021いちご
00022みかん
00023りんご
00024ぶどう
00031なし
00032ぶどう
00033みかん
00034りんご
00041なし
00042りんご
00043もも
00044みかん
00051もも
00052もも
00053もも
00054もも

伝票0001でいちご・みかん・なし・りんごが、伝票0002でいちご・みかん・りんご・ぶどうが…売れたという情報を縦持ちで持っているテーブル([SAMPLE_tbl])である。
これを、伝票番号([Sales_No])ごとの横持ちのデータとして抽出したい。

こんなものである。

Sales_NoSell_Item1Sell_Item2Sell_Item3Sell_Item4
0001いちごみかんなしりんご
0002いちごみかんりんごぶどう
0003なしぶどうみかんりんご
0004なしりんごももみかん
0005もももももももも

下記のようなSQL文で、抽出することができる。

select
 [Sales_No],
 max(case [Line_No] when 1 then [Item] end) as [Sell_Item1],
 max(case [Line_No] when 2 then [Item] end) as [Sell_Item2],
 max(case [Line_No] when 3 then [Item] end) as [Sell_Item3],
 max(case [Line_No] when 4 then [Item] end) as [Sell_Item4]
from
[SAMPLE_tbl]
group by [Sales_No]


「case [Line_No] when 1 then [Item] end~case [Line_No] when 4 then [Item] end」の部分で、「Sales_No = 0001」を例に言うと、

Sales_NoSell_Item1Sell_Item2Sell_Item3Sell_Item4
0001いちごNULLNULLNULL
0001NULLみかんNULLNULL
0001NULLNULLなしNULL
0001NULLNULLNULLりんご

というデータが抽出される。
それを「Sales_No」でgroup化して「Sell_Item1~4」のmaxを取ると、値の入っているものが取られて(NULLが省かれて)上記のようなデータになるわけである。

なるほどな、と思った次第。

コメントの投稿











管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://hoshinahouse.blog101.fc2.com/tb.php/1119-76022e54