WITH code_t AS ( SELECT 'A' cd UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'F' ) , data_t AS ( SELECT 'A' cd UNION ALL SELECT 'A' UNION ALL SELECT 'A' UNION ALL SELECT 'C' UNION ALL SELECT 'D' UNION ALL SELECT 'D' UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'E' UNION ALL SELECT 'E' UNION ALL SELECT 'E' UNION ALL SELECT 'E' UNION ALL SELECT 'E' UNION ALL SELECT 'F' UNION ALL SELECT 'F' UNION ALL SELECT 'F' ) SELECT a.cd , COUNT(b.cd) cnt , ROUND(COUNT(b.cd) / SUM(COUNT(b.cd)) OVER() * 100, 2) rat FROM code_t a LEFT OUTER JOIN data_t b ON a.cd = b.cd GROUP BY a.cd ;
WITH t AS ( SELECT 'A' data FROM dual UNION ALL SELECT 'A' FROM dual UNION ALL SELECT 'A' FROM dual UNION ALL SELECT 'C' FROM dual UNION ALL SELECT 'D' FROM dual UNION ALL SELECT 'D' FROM dual UNION ALL SELECT 'D' FROM dual UNION ALL SELECT 'E' FROM dual UNION ALL SELECT 'E' FROM dual UNION ALL SELECT 'E' FROM dual UNION ALL SELECT 'E' FROM dual UNION ALL SELECT 'E' FROM dual UNION ALL SELECT 'E' FROM dual UNION ALL SELECT 'F' FROM dual UNION ALL SELECT 'F' FROM dual UNION ALL SELECT 'F' FROM dual ) SELECT b.str AS grade , COUNT(a.data) AS cnt , ROUND((RATIO_TO_REPORT( COUNT(a.data)) OVER() * 100), 2)||'%' report FROM t a RIGHT JOIN ( SELECT str FROM t a, (SELECT SUBSTR('ABCDEFGHIZKLMNOPQRSTUVWXYZ', LEVEL, 1) AS str FROM dual CONNECT BY LEVEL <= 26) WHERE str <= a.data GROUP BY str ) b ON a.data = b.str GROUP BY b.str ORDER BY b.str