Преобразовать один столбец как заголовок столбца других столбцов - PullRequest
0 голосов
/ 29 января 2019

Я все еще пытаюсь обернуть голову вокруг Pivot и Unpivot и хотел бы получить результат моего желания, но я не могу понять, как получить результат моего желания.Поэтому я надеюсь, что некоторые из вас гуру ORACLE / T-SQL могут помочь мне здесь.

Цель моего запроса:

Преобразование одного столбца в заголовок столбца других столбцов (другие столбцы будутбыть вложенным в несколько столбцов, под которыми находится заголовок столбца)

Здесь я приведу всю информацию о моем вопросе, ожидаемом результате и том, что я пытаюсь

Сценарий таблицы:

CREATE TABLE LC_PERFORMANCE_O
(PERIOD VARCHAR2(100), LC_NUMBER VARCHAR2(20), LC_VALUE NUMBER)

Сценарий вставки:

SET DEFINE OFF;
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('JANUARY10', 69, 5282964.68, '01');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('FEBRUARY10', 57, 4345701.5, '02');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('MARCH10', 63, 2570537.13, '03');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('APRIL10', 51, 2003928.9, '04');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('MAY10', 62, 2729072.07, '05');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('JUNE10', 51, 5455665.58, '06');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('JULY10', 55, 4499081.21, '07');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('AUGUST10', 55, 2493876.83, '08');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('SEPTEMBER10', 68, 3203650.57, '09');
Insert into LC_PERFORMANCE
   (PERIOD, LC_NUMBER, LC_VALUE, PERIOD_NO)
 Values
   ('OCTOBER10', 107, 7795475.07, '10');
COMMIT;

Ввод: LC_PERFORMANCE Таблица

+-------------+-----------+------------+-----------+
| PERIOD      | LC_NUMBER | LC_VALUE   | PERIOD_NO |
+-------------+-----------+------------+-----------+
| JANUARY10   | 69        | 5282964.68 | 01        |
+-------------+-----------+------------+-----------+
| FEBRUARY10  | 57        | 4345701.5  | 02        |
+-------------+-----------+------------+-----------+
| MARCH10     | 63        | 2570537.13 | 03        |
+-------------+-----------+------------+-----------+
| APRIL10     | 51        | 2003928.9  | 04        |
+-------------+-----------+------------+-----------+
| MAY10       | 62        | 2729072.07 | 05        |
+-------------+-----------+------------+-----------+
| JUNE10      | 51        | 5455665.58 | 06        |
+-------------+-----------+------------+-----------+
| JULY10      | 55        | 4499081.21 | 07        |
+-------------+-----------+------------+-----------+
| AUGUST10    | 55        | 2493876.83 | 08        |
+-------------+-----------+------------+-----------+
| SEPTEMBER10 | 68        | 3203650.57 | 09        |
+-------------+-----------+------------+-----------+

Ожидаемый вывод: из представления БД

+-----------------+----------------+-----------------+----------------+-----------------+-----------------+-----------------+
|   JANUARY10     |  FEBRUARY10    |    MARCH10      |    APRIL10     |     MAY10       |     JUNE10      | Continuous year |
+-----------------+----------------+-----------------+----------------+-----------------+-----------------+-----------------+
| 69 | 5282964.68 | 57 | 4345701.5 | 63 | 2570537.13 | 51 | 2003928.9 | 62 | 2729072.07 | 51 | 5455665.58 | ...    | ...    |
+----+------------+----+-----------+----+------------+----+-----------+----+------------+----+------------+--------+--------+

Мой запрос:

CLEAR COLUMNS
COLUMN TEMP_IN_STATEMENT NEW_VALUE STR_IN_STATEMENT;

/

SELECT   DISTINCT
         LISTAGG ('''' || PERIOD || ''' AS ' || PERIOD, ',')
            WITHIN GROUP (ORDER BY PERIOD_NO)
            AS TEMP_IN_STATEMENT
  FROM   (SELECT   DISTINCT PERIOD, PERIOD_NO FROM IMPORT_LC_PERFORMANCE);

/

SELECT * FROM
(
SELECT * FROM
    (SELECT PERIOD,LC_VALUE FROM IMPORT_LC_PERFORMANCE)
    PIVOT (MAX( LC_VALUE  ) FOR PERIOD IN (&STR_IN_STATEMENT))
    UNION
SELECT * FROM
    (SELECT PERIOD,LC_NUMBER FROM IMPORT_LC_PERFORMANCE)
    PIVOT (MAX( LC_NUMBER  ) FOR PERIOD IN (&STR_IN_STATEMENT))
    )T

Результат по моему запросу:

+------------+------------+------------+-----------+------------+------------+------------+------------+-------------+------------+
| JANUARY10  | FEBRUARY10 | MARCH10    | APRIL10   | MAY10      | JUNE10     | JULY10     | AUGUST10   | SEPTEMBER10 | OCTOBER10  |
+------------+------------+------------+-----------+------------+------------+------------+------------+-------------+------------+
| 69         | 57         | 63         | 51        | 62         | 51         | 55         | 55         | 68          | 107        |
+------------+------------+------------+-----------+------------+------------+------------+------------+-------------+------------+
| 5282964.68 | 4345701.5  | 2570537.13 | 2003928.9 | 2729072.07 | 5455665.58 | 4499081.21 | 2493876.83 | 3203650.57  | 7795475.07 |
+------------+------------+------------+-----------+------------+------------+------------+------------+-------------+------------+
...