У меня есть сводные данные о среднемесячных продажах продуктов за квартал, как показано ниже:
Вывод накопительного пакета:
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.
Я не уверен, зачем он должен быть динамичным, ведь количество месяцев вряд ли изменится. Почему не просто:
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)
);