Я бы использовал оконные функции. Вот один из методов:
select top (1) with ties prod_cat_code, prod_subcat_code,
total_amt, avg_total_amt
from (select prod_cat_code, prod_subcat_code, sum(total_amt) as total_amt,
avg(total_amt) as avg_total_amt,
sum(sum(qty)) over (partition by prod_cat_code) as category_sum
from transactions t
group by prod_cat_code, prod_subcat_code
) cs
order by dense_rank() over (order by category_sum desc, prod_cat_code);
РЕДАКТИРОВАТЬ:
Вы также можете принять ваш подход. Вашему запросу просто необходимо несколько исправлений:
SELECT PROD_CAT_CODE, PROD_SUBCAT_CODE,
SUM(TOTAL_AMT) as [SUM], AVG(TOTAL_AMT) as [AVG]
FROM TRANSACTIONS t
WHERE t.PROD_CAT_CODE IN (SELECT TOP 5 t2.PROD_CAT_CODE
FROM TRANSACTIONS t2
GROUP BY t2.PROD_CAT_CODE
ORDER BY SUM(T2.QTY) DESC
)
GROUP BY PROD_CAT_CODE, PROD_SUBCAT_CODE
ORDER BY PROD_CAT_CODE, PROD_SUBCAT_CODE;
Основные проблемы с вашим запросом:
- Используйте
IN
вместо =
с подзапросом. - Вернуть только один столбец с подзапросом.
- Включить
PROD_CAT_CODE
во внешний запрос как для SELECT
, так и GROUP BY
. - . Использовать псевдонимы таблиц для различенияссылки на таблицы в подзапросе и внешнем запросе.