This won't be a real 'view' in the SQL sense (you can only create that via a DDL query), but you can certainly build an ActiveRelation (which is probably what you meant anyhow). Note that you are switching between 'value' and 'position' arbitrarily, is that on purpose? I'm using 'value' for consistency sake here:
group_sql = <<-SQL
CASE WHEN value = 1 THEN 'one'
WHEN value = 2 THEN 'two'
WHEN value = 3 THEN 'three'
WHEN value <= 10 THEN 'ten'
WHEN value <= 20 THEN 'twenty'
WHEN value <= 30 THEN 'thirty'
WHEN value <= 40 THEN 'forty'
WHEN value <= 50 THEN 'fifty'
SQL
report = self.project_reports.where('value < 50').group(group_sql)
positions = report.count
positions['total'] = positions.values.sum