Используйте UNPIVOT
с несколькими аргументами в предложении FOR ( ... ) IN
:
Установка Oracle :
CREATE TABLE table_name (
id, cat1_y1_fact, cat1_y2_fact, cat1_y3_fact, cat2_y1_fact, cat2_y2_fact, cat2_y3_fact
) AS
SELECT LEVEL,
100 * LEVEL + 11,
100 * LEVEL + 12,
100 * LEVEL + 13,
100 * LEVEL + 21,
100 * LEVEL + 22,
100 * LEVEL + 23
FROM DUAL
CONNECT BY LEVEL <= 3;
Запрос :
SELECT *
FROM table_name
UNPIVOT ( fact FOR (cat, year) IN (
cat1_y1_fact AS (1, 1),
cat1_y2_fact AS (1, 2),
cat1_y3_fact AS (1, 3),
cat2_y1_fact AS (2, 1),
cat2_y2_fact AS (2, 2),
cat2_y3_fact AS (2, 3)
) )
Выход :
ID | CAT | YEAR | FACT
-: | --: | ---: | ---:
1 | 1 | 1 | 111
1 | 1 | 2 | 112
1 | 1 | 3 | 113
1 | 2 | 1 | 121
1 | 2 | 2 | 122
1 | 2 | 3 | 123
2 | 1 | 1 | 211
2 | 1 | 2 | 212
2 | 1 | 3 | 213
2 | 2 | 1 | 221
2 | 2 | 2 | 222
2 | 2 | 3 | 223
3 | 1 | 1 | 311
3 | 1 | 2 | 312
3 | 1 | 3 | 313
3 | 2 | 1 | 321
3 | 2 | 2 | 322
3 | 2 | 3 | 323
db <> скрипка здесь
Для нескольких сводных столбцов синтаксис приведен в Oracle SELECT
документации :
Oracle Setup :
CREATE TABLE table_name (
id, cat1_y1_fact, cat1_y2_fact, cat1_y3_fact, cat2_y1_fact, cat2_y2_fact, cat2_y3_fact,
cat1_y1_value, cat1_y2_value, cat1_y3_value, cat2_y1_value, cat2_y2_value, cat2_y3_value
) AS
SELECT LEVEL,
100 * LEVEL + 11,
100 * LEVEL + 12,
100 * LEVEL + 13,
100 * LEVEL + 21,
100 * LEVEL + 22,
100 * LEVEL + 23,
1000 * LEVEL + 110,
1000 * LEVEL + 120,
1000 * LEVEL + 130,
1000 * LEVEL + 210,
1000 * LEVEL + 220,
1000 * LEVEL + 230
FROM DUAL
CONNECT BY LEVEL <= 3;
Запрос :
SELECT *
FROM table_name
UNPIVOT ( (fact, value) FOR (cat, year) IN (
(cat1_y1_fact, cat1_y1_value) AS (1, 1),
(cat1_y2_fact, cat1_y2_value) AS (1, 2),
(cat1_y3_fact, cat1_y3_value) AS (1, 3),
(cat2_y1_fact, cat2_y1_value) AS (2, 1),
(cat2_y2_fact, cat2_y2_value) AS (2, 2),
(cat2_y3_fact, cat2_y3_value) AS (2, 3)
) )
Выход :
ID | CAT | YEAR | FACT | VALUE
-: | --: | ---: | ---: | ----:
1 | 1 | 1 | 111 | 1110
1 | 1 | 2 | 112 | 1120
1 | 1 | 3 | 113 | 1130
1 | 2 | 1 | 121 | 1210
1 | 2 | 2 | 122 | 1220
1 | 2 | 3 | 123 | 1230
2 | 1 | 1 | 211 | 2110
2 | 1 | 2 | 212 | 2120
2 | 1 | 3 | 213 | 2130
2 | 2 | 1 | 221 | 2210
2 | 2 | 2 | 222 | 2220
2 | 2 | 3 | 223 | 2230
3 | 1 | 1 | 311 | 3110
3 | 1 | 2 | 312 | 3120
3 | 1 | 3 | 313 | 3130
3 | 2 | 1 | 321 | 3210
3 | 2 | 2 | 322 | 3220
3 | 2 | 3 | 323 | 3230
дБ <> скрипка здесь