ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

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