Поскольку вы пытаетесь сравнить все строки с одним значением, вы должны убедиться, что вы получаете это единственное значение только один раз. Следующий код имел приличную производительность в одной из моих больших локальных баз данных (имена таблиц были изменены, чтобы защитить невинных):
WITH CTE_Overall_Avg AS (SELECT AVG(total_amt) AS overall_avg FROM Transactions)
SELECT
TX.prod_cat,
AVG(TX.total_amt) AS prod_cat_avg,
MAX(OA.overall_avg) AS overall_avg
FROM
Transactions TX
INNER JOIN CTE_Overall_Avg OA ON 1 = 1
GROUP BY
TX.prod_cat
HAVING
AVG(TX.total_amt) > OA.overall_avg