Top / TIPS / 横展開のテーブルを縦展開にする

次のように、横展開されたテーブル(CTABLE) があります。

CODENAMEITEM01ITEM02ITEM03ITEM04
00001名称0000111121314
00002名称00002212223NULL

ITEM01 〜 ITEM04 は、同じ目的の項目なのですが、SQL で扱うときは、非常に不便です。 次のような構成(縦展開)だと、とても扱いやすいはずです。 

CODENAMENOITEM
00001名称000010111
00001名称000010212
00001名称000010313
00001名称000010414
00002名称000020121
00002名称000020222
00002名称000020323
00002名称0000204NULL

このようにテーブルを扱うときは、UNION ALL クエリーを使います。

SELECT CODE, NAME, 01 NO, ITEM01 ITEM FROM CTABLE
   UNION ALL
SELECT CODE, NAME, 02 NO, ITEM02 ITEM FROM CTABLE
   UNION ALL
SELECT CODE, NAME, 03 NO, ITEM03 ITEM FROM CTABLE
   UNION ALL
SELECT CODE, NAME, 04 NO, ITEM04 ITEM FROM CTABLE

ただし、oo4o には、バグがあるので、項目それぞれに、エイリアス名を指定しなければなりません。

SELECT CODE CODE,NAME NAME, 01 NO, ITEM01 ITEM FROM CTABLE
   UNION ALL
SELECT CODE CODE,NAME NAME, 02 NO, ITEM02 ITEM FROM CTABLE
   UNION ALL
SELECT CODE CODE,NAME NAME, 03 NO, ITEM03 ITEM FROM CTABLE
   UNION ALL
SELECT CODE CODE,NAME NAME, 04 NO, ITEM04 ITEM FROM CTABLE

このうち、ITEM が NULL のものを除き、ORDER BY をつけてソートしましょう。

SELECT CODE, NAME, NO, ITEM FROM
 ( SELECT CODE CODE,NAME NAME, 01 NO, ITEM01 ITEM FROM CTABLE
   UNION ALL
   SELECT CODE CODE,NAME NAME, 02 NO, ITEM02 ITEM FROM CTABLE
   UNION ALL
   SELECT CODE CODE,NAME NAME, 03 NO, ITEM03 ITEM FROM CTABLE
   UNION ALL
   SELECT CODE CODE,NAME NAME, 04 NO, ITEM04 ITEM FROM CTABLE) U_CTABLE
WHERE ITEM IS NOT NULL
ORDER BY CODE, NO



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-10-25 (日) 23:56:02 (2973d)