Есть ли способ разделить столбец, который был объединен в отдельные столбцы? - PullRequest
0 голосов
/ 20 февраля 2020

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

Я бы хотел поместить каждую из этих строк в отдельный столбец, чтобы иметь возможность запускать отчеты. Это моя текущая функция LISTAGG:

 LISTAGG(CE1.DX_NAME, ' ; ') WITHIN GROUP (ORDER BY CE1.DX_NAME) AS DIAGNOSES 

Есть ли способ разделить их из этой функции на отдельные столбцы или какие-либо рекомендации, если я могу использовать функцию без LISTAGG для получения желаемых результатов?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

... поскольку в столбце может быть неограниченное количество строк

Для любого запроса Oracle должен иметь возможность определять количество столбцов в наборе результатов. , а также имя и тип данных каждого, когда запрос анализируется. По этой причине не существует разумного способа отправить запрос, который будет возвращать набор результатов с произвольным числом столбцов, управляемых данными. (Для «неразумного» и действительно крутого способа см .: https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/).

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

Распространенный способ обработки таких требований, как у вас, - это написать запрос, который возвращает данные, которые в данный момент находятся в вашем LISTAGG в качестве отдельных строк и используйте отчеты, такие как Qlik, OBIEE или все, что способно к перекрестным таблицам или сводным точкам в их интерфейсе.

Другим распространенным способом является жесткое ограничение количества столбцов. Например, если вы знаете, что ваши данные никогда не будут иметь более 30 столбцов, вы можете использовать условное агрегирование Гордона (см. Его ответ на этот вопрос).

1 голос
/ 20 февраля 2020

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

select grp,
       max(case when seqnum = 1 then col end) as col_1,
       max(case when seqnum = 2 then col end) as col_2,
       max(case when seqnum = 3 then col end) as col_3
from (select t.*,
             row_number() over (partition by grp order by col) as seqnum
      from t
     ) t
group by grp;

В вашем вопросе нет специфики, но здесь показана общая структура такого запроса. .

...