Você poderia faça isso deste modo:
SELECT
CASE WHEN ROW_NUMBER() OVER(PARTITION BY Category ORDER BY BudgetType) = 1
THEN Category ELSE NULL END AS 'Category Caption'
, Category
, BudgetType
FROM yourTable
ORDER BY Category, BudgetType
Mas, como Mikael mencionou, isso - na maioria dos casos - realmente não é a maneira como deve ser feito. Basta pensar que o cliente pode, por exemplo, querer alterar a classificação dentro das categorias, então a 'primeira' linha dentro de cada categoria será diferente.