Oracleテーブルの行列から第1/2ページを転置します。


NO.
MONEY
DAY
1
23
1
1
43
2
1
-45
3
2
42
1
2
-10
2
2
50
3
3
100
8
読書習慣に適合するために、最終的なレポートは次のような形式を望んでいます。
NO.
MON
TUTE
THR
1
23
43
-45
2
42
-10
50
3
 
 
 
--------------
私達は一歩ずつ実現します。
1.DECODEを用いた変換行為列
SQL:
SELECT NO    DECODE(DAY,1,MONEY,')DAY 1,    DECODE(DAY,2,MONEY,')DAY 2,    DECODE(DAY,3,MONEY,')DAY 3 FROM TEMP
結果:
NO.
DAY 1
DAY 2
DAY 3
1
23
1
43
1
-45
2
42
2
-10
2
50
3
 
 
 
2.NOフィールドでグループ化し、列名を変更する
SQL:
SELECT NO,MAX(DAY 1)MON,MAX(DAY 2)TUTE,MAX(DAY 3)THR FROM(SELECT NO        DECODE(DAY,1,MONEY,')DAY 1,        DECODE(DAY,2,MONEY,')DAY 2,        DECODE(DAY,3,MONEY,')DAY 3     FROM TEMP) GROUTP BY NO
結果:
NO.
MON
TUTE
THR
1
23
43
-45
2
42
-10
50
3
 
 
 
--------------
難点帰納:
1.DECODEデフォルト値設定
DECODEの文法は以下の通りです。decode(条件、値1、翻訳値1、値2、翻訳値2、…値n、翻訳値n、デフォルト値)
デフォルト値が''('2つのシングル引用符)から0に変更された場合、すなわちSQL:
SELECT NO,MAX(DAY 1)MON,MAX(DAY 2)TUTE,MAX(DAY 3)THR FROM(SELECT NO        DECODE(DAY,1,MONEY,0)DAY 1,        DECODE(DAY,2,MONEY,0)DAY 2,        DECODE(DAY,3,MONEY,0)DAY 3     FROM TEMP) GROUTP BY NO
結果は以下の通りです。
NO.
MON
TUTE
THR
1
23
43
0
2
42
0
50
3
0
0
0
2.列デフォルト値設定(DAY値8の表示は「undefined」)
SQL:
SELECT NO,MONEY    DECODE(DAY,1,'MON',2,'TURE',3,'THR','undefined')DAYFROM TEMP
結果:
NO.
MONEY
DAY
1
23
MON
1
43
TUTE
1
-45
THR
2
42
MON
2
-10
TUTE
2
50
THR
3
100
undefined
3.行列変換はフォーム内のデータ量が大きい場合、消費が大きいです。
理由:
1.スキャン対象データの時間オーバーヘッドが大きい。
2.GROUT BYの場合、データ冗長による複数行マージ。
利点:
テーブル構造が安定しています。DAYは新しい値を追加して記録を追加するだけで、新しい列を追加する必要がありません。次のページのdecodeの手紙の腰掛けの眉記
1 2 次のページ 全文を読む