モトネタはこちら
Ask Tom "Yup, ANOTHER Rows to Columns (or vice-versa) question. Sorry.", version 9.2.0
こういうデータに対して
TestID Name Phone
------- ------- ----------
1 John 1234567
2 Peter 9876543
こんなふうにしたい
Row1 Row2
-------- ----------
1 2
John Peter
1234567 9876543
けど、こうなっちゃう↓という質問に対して
Row1 Row2
-------- ----------
1 NULL
John NULL
1234567 NULL
NULL 2
NULL Peter
NULL 9876543
Tomの回答は、
10g以前だと
ops$tkyte%ORA9IR2> select rw,
2 max(decode( rn, 1, decode( rw, 1, to_char(testid), 2, name, 3, phone) )) r1,
3 max(decode( rn, 2, decode( rw, 1, to_char(testid), 2, name, 3, phone) )) r2
4 from (select testid, name, phone, row_number() over (order by testid) rn
5 from test),
6 (select level RW from dual connect by level <= 3)
7 group by rw
8 /
RW R1 R2
---------- ---------- ----------
1 1 2
2 John Peter
3 1234567 9876543
11gだと、pivot/unpivot関数を使って
ops$tkyte%ORA11GR1> with data
2 as
3 (
4 select rn, data, thing
5 from (select to_char(testid) testid, name, phone, to_char(rownum) rn from test )
6 unpivot ( data for thing in ( testid , name, phone) )
7 )
8 select thing, row1, row2
9 from data
10 pivot( max(data) for rn in ( '1' as row1, '2' as row2 ))
11 /
THING ROW1 ROW2
------ ---------- ----------
TESTID 1 2
PHONE 1234567 9876543
NAME John Peter
最近のコメント