Как создать динамическую сводную таблицу с созданными столбцами, используя Oracle SQL 11g - PullRequest
0 голосов
/ 06 июня 2018

В течение последних двух лет у меня есть небольшая работа по обучению Oracle SQL, благодаря которой я получил большую часть своей работы (это не большая часть моей работы, кроме простого выбора, удаления, обновления, поворота и т. Д.).).Недавно я получил очень сложное требование, намного превышающее мои технические возможности, к сожалению, у меня нет доступа к профессиональному администратору базы данных, чтобы получить некоторую помощь по этому вопросу.Мне нужен SQL-скрипт оракула, который вернет правильные данные и формат.

Сделанный мной запрос возвращает необходимую информацию:

SELECT T1.ATTRIBUTE_1,
T1.ATTRIBUTE_2,
T1.ATTRIBUTE_3,
T1.COMMON_IDENTIFIER,
T2.ERROR,
T2.STATUS,
T2.TYPE
T2.TYPE_NUMBER
FROM TABLE_1 T1,
TABLE_2 T2
WHERE T1.COMMON_IDENTIFIER = T2.COMMON_IDENTIFIER;

Это намного проще, чемрезультаты, которые я ищу, но имеют все данные, которые мне нужны, и это дает такие результаты (результаты, которые я ищу, будут продиктованы третьей таблицей):

ATTRIBUTE_1   ATTRIBUTE_2 ATTRIBUTE_3 COMMON_IDENTIFER    ERROR   STATUS  TYPE    TYPE_NUMBER
  BLAH          BLAH          BLAH            A1            E       S    TYPE i    #######
  BLAH          BLAH          BLAH            A1            E       S    TYPE ii   #######
  BLAH          BLAH          BLAH            A1            E       S    TYPE iii  #######
  BLAH          BLAH          BLAH            A5            E       S    TYPE i    #######
  BLAH          BLAH          BLAH            A5            E       S    TYPE ii   #######
  BLAH          BLAH          BLAH            A7            E       S    TYPE i    #######
  BLAH          BLAH          BLAH            A1            E       S    TYPE iv   #######

Я почесался через Интернет и нашел простой пример того, какой тип поведения я ищу:

Поворот данных дважды с динамическим sql и именами пользовательских столбцов

Я попал в стену, пытаясь перевести это с SQL-сервера на оракула, но он шел медленно, и мне в конечном итоге нужно будет объединить результаты этого запроса с результатами из другой таблицы.

Я создал запрос, который получаетЯ близок к решению, но в нем отсутствуют данные ОШИБКА и СОСТОЯНИЕ для данного ТИПА и соответствующего TYPE_NUMBER:

SELECT * FROM (
   SELECT T1.COMMON_IDENTIFIER,
   T2.TYPE,
   T2.TYPE_NUMBER,
   T2.ERROR,
   T2.STATUS
   FROM TABLE_1 T1, TABLE_2 T2
   WHERE T1.COMMON_IDENTIFIER = T2.COMMON_IDENTIFIER
   AND T2.TYPE IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv'))
PIVOT (
   MAX(TYPE_NUMBER) FOR TYPE IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv')
   )

С результатами, выглядящими так:

COMMON_IDENTIFIER STATUS  ERROR   TYPE i   TYPE ii  TYPE iii  TYPE iv
        A1          S       E     #######  #######  #######   #######
        A5          S       E     #######  #######      
        A7          S       E     #######           

Это очень близко к тому, что я ищу, но мне не хватает данных ERROR и STATUS для каждого уникального TYPE_NUMBER для данного значения TYPE (TYPE i, TYPE ii и т. Д.).Кроме того, заголовки столбцов «TYPE i», «TYPE ii» и т. Д. Должны быть динамическими, поскольку их значения могут изменяться в любой момент времени и привязаны к третьей таблице.

Мне нужен оракулSQL-запрос, который даст мне результаты, которые будут выглядеть следующим образом:

ATTRIBUTE_1    ATTRIBUTE_2    ATTRIBUTE_3     COMMON_IDENTIFIER   ERROR_i  STATUS_i   TYPE_i   ERROR_ii   STATUS_ii   TYPE_ii  ERROR_iii   STATUS_iii  TYPE_iii   etc.                                                                 
  BLAH            BLAH           BLAH               A1               E      S         #######       E          S        #######     E           S        #######    
  BLAH            BLAH           BLAH               A5               E       S        #######       E          S        ####### 
  BLAH            BLAH           BLAH               A7               E       S        #######   

Некоторые примечания по результатам, которые я ищу:

-Значения дляСтолбец TYPE в первом запросе и используемый в качестве заголовков во втором искомом запросе, продиктован третьей таблицей, к которой у пользователя есть доступ, и он может забрать или добавить значения на лету.например, в первом запросе есть только 4 значения для столбца TYPE, это может измениться в любое время.

- Значение столбца TYPE_NUMBER специально связано со значением TYPE (TYPE i, TYPE ii и т. д.)вместе со значениями для столбца ERROR и STATUS.Поэтому, если пользователь создает новое значение TYPE в третьей таблице, мне нужно иметь возможность динамически создавать столбцы TYPE_XX, ERROR_XX и STATUS_XX для учета изменений.

Как я уже говорил выше, выше моего техническогоспособность и я прошу прощения за любую избыточность.У меня нет никакого формального обучения SQL, так как все это было на работе, я просто хотел быть максимально ясным при описании проблемы и решения, которое я ищу.

Спасибо зазаранее за любую помощь!

1 Ответ

0 голосов
/ 06 июня 2018

Отдельные значения ERROR и STATUS могут быть достигнуты довольно легко:

SELECT * FROM (
    SELECT T1.common_identifier, T2.type
         , T2.type_number, T2.error, T2.status
      FROM table_1 T1 INNER JOIN table_2 T2
        ON t1.common_identifier = t2.common_identifier
     WHERE t2.type IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv')
) PIVOT (
    MAX(error) AS error
  , MAX(status) AS status
  , MAX(type_number) AS type
      FOR type IN ( 'TYPE i' AS i, 'TYPE ii' AS ii
                  , 'TYPE iii' AS iii, 'TYPE iv' AS iv )
)

Имена столбцов будут выглядеть немного странно - например, I_ERROR вместо ERROR_I - ноЯ полагаю, вы можете это исправить сами.

Динамическая часть сложнее;PIVOT сам по себе не работает с динамическими списками;для этого вам нужно будет использовать динамический SQL - например, в хранимой процедуре PL / SQL.

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