Хорошо, так что, по сути, вы хотите перечислить ВСЕ категории и включить Итого и Среднее, где такие данные доступны в указанный период времени?
Если это ваше намерение, то читайте дальше!
Прежде всего я переформатировал запрос, чтобы облегчить понимание структуры.Я переименовал псевдоним таблицы для User_Tranaction с «a» на «ut», а псевдоним для категории с «b» на «cat»
SELECT
cat.name,
ISNULL(SUM(amount),0) AS 'Total',
ISNULL(AVG(amount),0) AS 'Average'
FROM
User_Transaction AS ut
RIGHT OUTER JOIN Category AS cat
ON ut.category_id = cat.category_id
WHERE
ut.datestamp BETWEEN @date_from AND @date_to
GROUP BY
cat.name
ORDER BY
cat.name
Для достижения желаемого эффекта перечисления всех категорий итолько соответствующие пользовательские транзакции за период времени, я перевернул объединение таблиц, чтобы использовать LEFT OUTER JOIN из категории в User_Transaction.Кроме того, я переместил фильтрацию даты в предложение ON в соединении с User_Transaction.Это дает эффект предварительной фильтрации данных в User_Transactions до , результирующие данные связаны с данными категории.
SELECT
cat.name,
ISNULL(SUM(amount),0) AS 'Total',
ISNULL(AVG(amount),0) AS 'Average'
FROM
Category AS cat
LEFT OUTER JOIN User_Transaction AS ut
ON cat.category_id = ut.category_id
AND ut.datestamp BETWEEN @date_from AND @date_to
GROUP BY
cat.name
ORDER BY
cat.name
Надеюсь, что это поможет.