WITH unnested AS (
SELECT
problem_id,
grade,
unnest(holds) AS holds
FROM moonboard
), grade_total AS (
SELECT grade, count(problem_id) AS routes
FROM moonboard
GROUP BY 1
)
SELECT
grade,
upper(holds[:1]) AS letter,
holds[2:]::int AS number,
count(problem_id) AS routes,
count(problem_id)/grade_total.routes AS routes_pctg
FROM unnested
JOIN grade_total USING (grade)
GROUP BY 1,2,3,grade_total.routes
ORDER BY grade, letter, number
WITH unnested AS (
SELECT
moonboard_version,
problem_id,
grade,
unnest(holds) AS holds
FROM moonboard
), grade_total AS (
SELECT moonboard_version, grade, count(problem_id) AS routes
FROM moonboard
GROUP BY 1,2
)
SELECT
moonboard_version,
grade,
upper(holds[:1]) AS letter,
holds[2:]::int AS number,
grade_total.routes AS grade_routes,
count(problem_id) AS routes,
count(problem_id)/grade_total.routes AS routes_pctg
FROM unnested
JOIN grade_total USING (moonboard_version, grade)
GROUP BY moonboard_version, grade, letter, number, grade_total.routes
ORDER BY moonboard_version, grade, letter, number