declare @ntiles int = 10 declare @scale float = 10; with salary_ntiles as ( SELECT * ,NTILE(@ntiles) OVER (ORDER BY salary) AS ntile_group from salary ) , ntiles as ( select ntile_group, min(salary) as min_salary_in_group, max(salary) as max_salary_in_group, count(*) as samples_in_group from salary_ntiles group by ntile_group ) , salary_ntiles_min as ( select salary_ntiles.salary, min(ntiles.ntile_group) as ntile_group from salary_ntiles left join ntiles on salary_ntiles.ntile_group = ntiles.ntile_group and salary between min_salary_in_group and max_salary_in_group group by salary_ntiles.salary ) , ntiles_correct as ( select salary_ntiles_min.ntile_group as ntile_group_correct, min(salary.salary) as min_salary_in_group , max(salary.salary) as max_salary_in_group, count(*) as samples_in_group from salary left join salary_ntiles_min on salary.salary = salary_ntiles_min.salary group by salary_ntiles_min.ntile_group ) select *, REPLICATE('*',cast(samples_in_group/@scale as bigint)) as dist from ntiles_correct order by ntile_group_correct