pradeep kumar Ответов: 2

Динамический pivot в oracle( в предложении)


У меня есть такие данные

TYPE  RANGE               SALES
A     20180301-20180101     100
A     20171201-20171031   150 
A     20170930-20170731    100
B     20180301-20180101    200
B     20171201- 20171031   200

я хочу получить такой результат

TYPE 20180301-20180101   20171201-20171031 20170930-20170731
A      100                   150               100


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

Это то, что я пробовал

SELECT
FROM
(
SELECT TYPE,MONTH_RANGE,SALES
FROM TABLE
)
pivot
(
    SUM(SALES)
    FOR (MONTH_RANGE) IN (SELECT DISTINCT MONTH_RANGE FROM TABLE)
)


И я тоже пробовал использовать XML, но он не в правильном формате

pivot xml (SUM(SALES) for (month_range) in (SELECT DISTINCT MONTH_RANGE FROM TABLE))


Я хочу, чтобы этот месячный диапазон был динамичным, а не таким, как
for month_range in ('20180301-20180101')

2 Ответов

Рейтинг:
1

Wendelius

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

Таким образом, одна из возможностей состоит в том, чтобы сделать это в два этапа: сначала получить диапазоны, а затем построить инструкцию SQL и выполнить ее. Другой подход может заключаться в том, чтобы забыть о динамическом повороте и извлечь динамическую часть с помощью XMLELEMENT


Maciej Los

5ed!

Рейтинг:
1

Maciej Los

Я бы посоветовал вам прочитать это: Динамический pivot в oracle sql - переполнение стека[^] - второе решение.