Vous pourriez faites comme ceci :
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
Mais comme Mikael l'a mentionné, ce n'est - dans la plupart des cas - vraiment pas la façon dont cela devrait être fait. Pensez simplement que le client peut, par exemple, vouloir modifier le tri dans les catégories, alors la "première" ligne dans chaque catégorie sera différente.