Oracle отменяет многие к одному - PullRequest
0 голосов
/ 03 октября 2019

Я хотел бы отключить от 1 столбца до 3 строк, и мои данные выглядят как this.

для преобразования в this.

С этим кодом я получаю 1 к 2, но не 1 к 3: SELECT * FROM (SELECT ID, CAT1_Y1_FACT, CAT1_Y2_FACT, CAT1_Y3_FACT, CAT2_Y1_FACT, CAT2_Y2_FACT, CAT2_Y3_FACT FROM TABLE T) UNPIVOT(CAT1_Y1_FACT FOR NBR_YEARS IN(CAT1_Y1_FACT AS 1, CAT1_Y1_FACT AS 2, CAT1_Y1_FACT AS 3))

1 Ответ

0 голосов
/ 03 октября 2019

Используйте 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

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...