To the above table I have two personal observations:

1. The table looks like the result of a join.
2. The table looks like a work table, prepping for a report.

Obviously there is no one solution, so I have to agree to... keep our options open.


The problem arises when for the same int values, we apply different grading scales.
4 could mean A or F (100 or 40).

As for all the other types, there are a lot of grading systems and grading scales. Trying to oversimplify the grading systems and the grading scales for the grading systems by reducing them to basic columns creates confusion and restricts the adoptions of new similar or even completely different systems and scales.

So, having just the (grade type, grade) couple in the lookup table to represent a grade (instead of a n-uple of null columns), separate from the grades systems classification table, works better, in my personal opinion.

On the other hand, you could have (grade type, grade) couple, where grade is always expressed as percentage, and interpret the values in different systems: integer, text, based on notation conventions.

EX: 2 | 80.00, is int:8 and 3 | 80.00 is B.
'2' grade type being int, '3' grade type being text.


GRADE_TYPES
-----------------
1 | %
2 | Z
3 | α


LOOKUP
--------------------
203 | 158 | 1 | 80.00
508 | 158 | 2 | 80.00
1056 | 158 | 3 | 80.00

GRADES_ALPHA
------------------
B | 80.00