sr_ca1 Ответов: 1

Как достичь нижеприведенных критериев в SQL/plsql


У меня есть запрос, который выглядит так

Выберите n.id, n.odn_no, n.acc,
Listagg('Item ID:'|| (SELECT value FROM partner WHERE col1 = 'ABC' ) ,'|')
внутри группы( заказ по n.id, n.odn_no, n.acc ) в качестве элемента
Из main_table n GROUP BY n.id, n.odn_no, n.acc

производит результаты, как показано ниже

идентификатор товара odn_no акк
1 odn1 ac1 p1|p2
2 odn2 ac2 p2|p3|p4
3 odn4 ac3 p6|p7|p8|p9|p5|p13|p14
и так далее которые являются динамическими из результатов запроса

Теперь мне нужно было бы изменить последний элемент столбца, который ранее был значением Listagg.
теперь я должен разделить элемент столбца на Item1 Item2 Item3 и так далее в зависимости от результатов, полученных Listagg. Например, если строка имеет 10 значений, разделенных разделителем '|' для элемента столбца, то заголовки результата должны иметь Item1, Item2 , Item3 ... Item10.
Если запись имеет только 2 значения для этого поля, то она должна попасть под Item1, Item2, а остальные будут пустыми. т. е. для приведенных выше результатов я должен показать, как показано ниже


идентификатор odn_no акк место № 1 место № 2 Item3 Item4 Item5 Item6 Item7
1 odn1 ac1 p1 p2
2 odn2 ac2 p2 p3 p4
3 odn4 АС3 П6 П7 П8 П9 П5, П13, п14


Пожалуйста, помогите мне, как это сделать в Oracle Sql/plsql. Заранее спасибо.

Что я уже пробовал:

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

1 Ответов

Рейтинг:
0

Jörgen Andersson

Используйте функцию pivot.
Здесь есть довольно хороший учебник: pivot и unpivot запросы в 11g[^]

Если ваш сервер старше 11G, вам нужно использовать CASE WHEN. Вот еще один урок: Пример сводных данных в SQL (строки в столбцы и столбцы в строки) | Oracle FAQ[^]