LoginSignup
7
10

More than 5 years have passed since last update.

Excelの「行列を入れ替える」っぽいことをSQLのUNPIVOT/PIVOTでやってみる。(Oracle Database)

Posted at

まずはサンプルデータの作成彡(゚)(゚)

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

図解すると↓のような感じ彡(゚)(゚)
IMG_2078.jpg

INPIVOTで列(VALUE1~3)を行に変換して、PIVOTで行(XXXXX, YYYYY)を列に変換。
2行のレコードの複数列を比較するようなケースで、使えるんかと彡(゚)(゚)

下記ページを参照しております(`・ω・)ゞ

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10