Можно ли условно поворачивать столбцы разных типов данных в Oracle? - PullRequest
1 голос
/ 25 октября 2019

Использование Oracle 12c. У меня есть запрос, который возвращает все данные, которые мне нужны, однако он разбит на несколько строк. Я пытаюсь использовать сводную таблицу для консолидации данных из n строк в 1 строку, транспонируя n уникальных наборов значений из 2 столбцов в n столбцов, условно выбирая, какой столбец из набора столбцов использовать значение для каждого из n транспонированныхколонны. Я изо всех сил пытаюсь выяснить, возможно ли это или не может быть сделано.

Ниже приведен упрощенный пример того, что возвращает запрос:

| ID | Inst_Created | Inst_Modified | Inst_Group | Inst_Prop | VAL_INT | VAL_REAL | VAL_STR |
+----+--------------+---------------+------------+-----------+---------+----------+---------+
| 01 |   1571954537 |    1571954537 |  GenGroup1 |  IntProp1 |       0 |   (null) |  (null) |
| 01 |   1571954537 |    1571954537 |  GenGroup1 | RealProp2 |  (null) | 12.34567 |  (null) |
| 01 |   1571954537 |    1571954537 |  GenGroup1 | RealProp3 |  (null) | 123.4567 |  (null) |
| 01 |   1571954537 |    1571954537 |  GenGroup1 |  StrProp4 |  (null) |   (null) | dirpath |
| 01 |   1571954537 |    1577754537 |  GenGroup2 |  IntProp5 |    1337 |   (null) |  (null) |
| 01 |   1571954537 |    1577754537 |  GenGroup2 | RealProp6 |  (null) |    13.37 |  (null) |
| 01 |   1570054537 |    1570854537 |  GenGroup3 |  StrProp7 |  (null) |   (null) | testing |
| 01 |   1570054537 |    1570854537 |  GenGroup3 |  StrProp8 |  (null) |   (null) |  valid  |
| 02 |   1571954540 |    1571954540 |  GenGroup1 |  IntProp1 |       1 |   (null) |  (null) |
| 02 |   1571954540 |    1571954540 |  GenGroup1 | RealProp2 |  (null) | 12.34568 |  (null) |
| 02 |   1571954540 |    1571954540 |  GenGroup1 | RealProp3 |  (null) | 123.4568 |  (null) |
| 02 |   1571954540 |    1571954540 |  GenGroup1 |  StrProp4 |  (null) |   (null) | dirpat2 |
| 02 |   1571954540 |    1577754540 |  GenGroup2 |  IntProp5 |    1338 |   (null) |  (null) |
| 02 |   1571954540 |    1577754540 |  GenGroup2 | RealProp6 |  (null) |    13.38 |  (null) |
| 02 |   1570054540 |    1570854540 |  GenGroup3 |  StrProp7 |  (null) |   (null) | testin2 |
| 02 |   1570054540 |    1570854540 |  GenGroup3 |  StrProp8 |  (null) |   (null) |  valid2 |
+----+--------------+---------------+------------+-----------+---------+----------+---------+

Столбцы Inst_Created и Inst_Modified являются временными метками эпохи моделирования. Столбцы VAL_INT, VAL_REAL и VAL_STR имеют типы данных NUMBER (38,0), FLOAT и VARCHAR2 (1024) соответственно. Только один из трех столбцов VAL_ * будет ненулевым для любой данной строки;Вы можете узнать, какой из трех будет столбцами Inst_Group, Inst_Prop.

Ниже приведен упрощенный пример того, что я пытаюсь получить с помощью сводной таблицы:

| ID | Earliest_Created | Latest_Modified | G1P1_Int | G1P2_Real | G1P3_Real | G1P4_Str | G2P5_Int | G2P6_Real | G3P7_Str | G3P8_Str |
+----+------------------+-----------------+----------+-----------+-----------+----------+----------+-----------+----------+----------+
| 01 |       1570054537 |      1577754537 |        0 |  12.34567 |  123.4567 |  dirpath |     1337 |     13.37 |  testing |    valid |
| 02 |       1570054540 |      1579954540 |        1 |  12.34568 |  123.4568 |  dirpat2 |     1338 |     13.38 |  testin2 |   valid2 |
+----+------------------+-----------------+----------+-----------+-----------+----------+----------+-----------+----------+----------+

Я выяснил, как использовать предложения pivot_for_clause и pivot_in_clause для преобразования значений (Inst_Group, Inst_Prop) в столбцы при переименовании столбца. Я пытаюсь выяснить, как получить значения в транспонированных столбцах, с правильным типом данных.

Ранее я пытался использовать функцию LISTAGG в запросе, приводя все VAL_. * значения для varchar2, так что для значений VAL был только один столбец. Я отказался от этого метода из-за проблем, связанных с попыткой сделать каждый транспонированный столбец правильным исходным типом данных, и из-за снижения производительности все это, казалось, вызывало.

1 Ответ

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

Вы можете достичь этого, используя conditional aggreagation:

Select ID, EARLIEST_CREATED, LATEST_MODIFIED,
MAX(CASE WHEN INST_GROUP = 'GenGroup1' and INST_PROP1 = 'IntProp1' THEN VAL_INT END) AS G1P1_INT,
MAX(CASE WHEN INST_GROUP = 'GenGroup1' and INST_PROP1 = 'RealProp2' THEN VAL_REAL END) AS G1P2_REAL,
...
..
.
From your_table
Group by ID, EARLIEST_CREATED, LATEST_MODIFIED;

Cheers !!

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