Convertissez la date de naissance en un nom de plage, puis faites un groupe par dessus avec count :
select
case when age < 18 then 'Under 18'
when age > 50 then 'Over 50'
else '18-50' end as range,
count(*) as count
from (select DATEDIFF(yy, user_dob, GETDATE()) as age from Customer) c
group by case when age < 18 then 'Under 18'
when age > 50 then 'Over 50'
else '18-50' end
En utilisant une sous-requête pour convertir la date de naissance en une plage, le calcul ne doit être effectué qu'une seule fois par ligne, il devrait donc être plus performant. Et c'est plus facile à lire.
De plus, en évitant les UNION, la requête peut être exécutée en un seul passage sur la table.