select count(*) [Population],DG.GroupAge from (select ms.dob,case when datediff(YEAR,ms.dob,getdate())< 10 then 'G10'
when datediff(YEAR,ms.dob,getdate()) between 10 and 19 then 'G 10-20'
when datediff(YEAR,ms.dob,getdate())between 20 and 29 then 'G 20-30'
when datediff(YEAR,ms.dob,getdate())between 30 and 39 then 'G 30-40'
when datediff(YEAR,ms.dob,getdate())between 40 and 49 then 'G 40-50'
when datediff(YEAR,ms.dob,getdate())between 40 and 49 then 'G 50-60'
else 'G60+' end as GroupAge
from people ms
where ms.id in (select max(id)
from dbo.table
group by customer_id)
and ms.location in ('CO','TX')) as DG
Group by DG.GroupAge
Order by GroupAge

Oh, I really thought of this because it may sometimes round up/down!Is this is right?

Please any alternative?

Thank you

--------------------------Joins are what RDBMS's do for a living

it should something like below for precise age calculation

...
CASE WHEN MONTH(GETDATE()) < MONTH(ms.dob)
OR (MONTH(GETDATE())= MONTH(ms.dob)
AND DAY(GETDATE()) < DAY(dob))
THEN datediff(YEAR,ms.dob,getdate())-1
ELSE datediff(YEAR,ms.dob,getdate())
END AS Age
...