Converti la data di nascita in un nome di intervallo, quindi esegui un gruppo superando quello con conteggio:
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
Utilizzando una sottoquery per convertire la data di nascita in un intervallo, il calcolo deve essere eseguito solo una volta per riga, quindi dovrebbe funzionare meglio. Ed è più facile da leggere.
Inoltre, evitando UNION, la query può essere eseguita in un passaggio sulla tabella.