まずはサンプルデータの作成彡(゚)(゚)
DROP TABLE TBL_10 PURGE;
CREATE TABLE TBL_10 (
COL1 VARCHAR2(10)
, VALUE1 NUMBER
, VALUE2 NUMBER
, VALUE3 NUMBER
);
INSERT INTO TBL_10 VALUES('XXXXX', 100, 200, 1000);
INSERT INTO TBL_10 VALUES('YYYYY', 200, 400, 2000);
COMMIT;
できた↓のデータが
SELECT * FROM tbl_10;
COL1 VALUE1 VALUE2 VALUE3
---------- ---------- ---------- ----------
XXXXX 100 200 1000
YYYYY 200 400 2000
↓の通り、UNPIVOTとPIVOTで行と列が入れ替わる彡(゚)(゚)
SELECT * FROM tbl_10
UNPIVOT(col_vals FOR col_names IN (value1, value2, value3))
PIVOT(MAX(col_vals) FOR col1 IN ('XXXXX', 'YYYYY'))
ORDER BY COL_NAMES;
COL_NA 'XXXXX' 'YYYYY'
------ ---------- ----------
VALUE1 100 200
VALUE2 200 400
VALUE3 1000 2000
もう少し解説すると、UNPIVOTで列(VALUE1, VALUE2, VALUE3)を行に変換して……・
SELECT * FROM tbl_10
UNPIVOT(col_vals FOR col_names IN (value1, value2, value3));
COL1 COL_NA COL_VALS
---------- ------ ----------
XXXXX VALUE1 100
XXXXX VALUE2 200
XXXXX VALUE3 1000
YYYYY VALUE1 200
YYYYY VALUE2 400
YYYYY VALUE3 2000
上記の状態で、PIVOTで行(XXXXX, YYYYY)を列に変換、COL_VALS列を集計(MAX)することで、行列が入れ替わるんやで彡(゚)(゚)
SELECT * FROM tbl_10
UNPIVOT(col_vals FOR col_names IN (value1, value2, value3))
PIVOT(MAX(col_vals) FOR col1 IN ('XXXXX', 'YYYYY'))
ORDER BY COL_NAMES;
COL_NA 'XXXXX' 'YYYYY'
------ ---------- ----------
VALUE1 100 200
VALUE2 200 400
VALUE3 1000 2000
INPIVOTで列(VALUE1~3)を行に変換して、PIVOTで行(XXXXX, YYYYY)を列に変換。
2行のレコードの複数列を比較するようなケースで、使えるんかと彡(゚)(゚)
下記ページを参照しております(`・ω・)ゞ
- 図でイメージするOracle DatabaseのSQL全集-第8回 PivotとUnPivot-
http://www.oracle.com/technetwork/jp/articles/otnj-sql-image8-1869298-ja.html