Сводные динамические данные в Oracle

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

Вывод накопительного пакета:

Product    Month    Sales
------------------------------
Product1    MAY    101.27
Product2    MAY    5.47
Product1    JUN    1481.19
Product2    JUN    84.95
ALL         QTR    836.44

Мне нужен окончательный результат в следующем формате:

            Product1  Product2   AverageSales
May         101.27    1481.19    (null)
Jun         5.47      84.95      (null)
Jul         0         0          (null)    
ALL         (null)    (null)     836.44

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

select * from (rollup output) 
PIVOT MIN(Sales) FOR Product IN ('Product1' AS Product1_sales, 'Product2' AS Product2_sales, 'ALL' AS Average Sales');

Я получил следующий вывод:

MONTH  Product1_sales    Product2_sales    Average Sales
MAY    5.47                 (null)              (null)
MAY     (null)              101.27              (null)  
JUN    84.95                (null)              (null)
JUN     (null)              1481.19             (null)
Qtr     (null)              (null)              836.44

Однако мне нужны данные в окончательном формате, упомянутом выше. Как я могу этого добиться? Кроме того, если данные за данный месяц квартала недоступны, я хочу отобразить его значение как 0 (также показанное в окончательном формате выше). Как я могу этого добиться, учитывая, что название месяца динамическое?

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

🤔 А знаете ли вы, что...
Oracle Corporation является создателем СУБД Oracle.


44
1

Ответ:

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

select product
     , nvl(jan,0) as jan
     , nvl(feb,0) as feb
     , nvl(mar,0) as mar
     , nvl(apr,0) as apr
     , nvl(may,0) as may
     , nvl(jun,0) as jun
     , nvl(jul,0) as jul
     , nvl(aug,0) as aug
     , nvl(sep,0) as sep
     , nvl(oct,0) as oct
     , nvl(nov,0) as nov
     , nvl(dec,0) as dec
from   rollup_output
pivot  (min(sales) for (month) in
       ( 'JAN' as jan, 'FEB' as feb, 'MAR' as mar, 'APR' as apr, 'MAY' as may, 'JUN' as jun
       , 'JUL' as jul, 'AUG' as aug, 'SEP' as sep, 'OCT' as oct, 'NOV' as nov, 'DEC' as dec)
       );

SQL Fiddle