Converteer de geboortedatum naar een bereiknaam en voer vervolgens een groep uit met het aantal:
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
Door een subquery te gebruiken om de geboortedatum naar een bereik te converteren, hoeft de berekening maar één keer per rij te worden uitgevoerd, dus het zou beter moeten presteren. En het is gemakkelijker te lezen.
Door UNION's te vermijden, kan de query ook in één keer over de tafel worden uitgevoerd.