Excelの「行列を入れ替える」っぽいことをSQLのUNPIVOT/PIVOTでやってみる。(Oracle Database)
まずはサンプルデータの作成彡(゚)(゚)
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
Qiitaにも書いたやで!彡(^)(^)
Excelの「行列を入れ替える」っぽいことをSQLのUNPIVOT/PIVOTでやってみる。(Oracle Database)
http://qiita.com/ora_gonsuke777/items/05fdc739be2c8c38f9e7