możesz zrób to tak:
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
Ale jak wspomniał Mikael, w większości przypadków nie jest to tak, jak powinno się to robić. Pomyśl tylko, że klient może na przykład chcieć zmienić sortowanie w ramach kategorii, wtedy „pierwszy” wiersz w każdej kategorii będzie inny.