Исходя из вышеизложенного предположения, что у вас есть столбец с датой покупки, я думаю, что следующий запрос будет соответствовать вашим потребностям:
WITH avg_sales AS
(
SELECT *
FROM (SELECT brand, to_char(purchase_date, 'MM') AS MONTH, price
FROM myTable)
PIVOT (AVG(price) AS AVG FOR MONTH IN ('01' AS JAN, '02' AS FEB, '03' AS MAR, '04' AS APR,
'05' AS MAY, '06' AS JUN, '07' AS JUL, '08' AS AUG,
'09' AS SEP, '10' AS OCT, '11' AS NOV, '12' AS DEC))
)
SELECT *
FROM avg_sales
UNION ALL
SELECT 'Total',
avg(jan_avg), avg(feb_avg), avg(mar_avg), avg(apr_avg),
avg(may_avg), avg(jun_avg), avg(jul_avg), avg(aug_avg),
avg(sep_avg), avg(oct_avg), avg(nov_avg), avg(dec_avg)
FROM avg_sales;
Это будет агрегировать за несколько лет, как написано сейчас, но выможно ограничить результаты с помощью BETWEEN в предложении WHERE самого внутреннего запроса или чего-то подобного.
Кроме того, если вы используете ROLLUP, будет работать следующий запрос:
SELECT DECODE(GROUPING(brand), 1, 'Total', brand) AS BRAND,
AVG(JAN_AVG) AS JAN_AVG, AVG(FEB_AVG) AS FEB_AVG, AVG(MAR_AVG) AS MAR_AVG, AVG(APR_AVG) AS APR_AVG,
AVG(MAY_AVG) AS MAY_AVG, AVG(JUN_AVG) AS JUN_AVG, AVG(JUL_AVG) AS JUL_AVG, AVG(AUG_AVG) AS AUG_AVG,
AVG(SEP_AVG) AS SEP_AVG, AVG(OCT_AVG) AS OCT_AVG, AVG(NOV_AVG) AS NOV_AVG, AVG(DEC_AVG) AS DEC_AVG
FROM (SELECT brand, to_char(purchase_date, 'MM') AS MONTH, price
FROM myTable)
PIVOT (AVG(price) AS AVG FOR MONTH IN ('01' AS JAN, '02' AS FEB, '03' AS MAR, '04' AS APR,
'05' AS MAY, '06' AS JUN, '07' AS JUL, '08' AS AUG,
'09' AS SEP, '10' AS OCT, '11' AS NOV, '12' AS DEC))
GROUP BY ROLLUP(brand)
ORDER BY GROUPING(brand), brand;