Given this test data ...
SQL> select * 2 from your_table 3 / NAME M1 M2 M3 M4 ---- ---------- ---------- ---------- ---------- A 1 2 3 4 B 6 3 4 5 C 1 5 2 1 SQL>
... a straightforward GREATEST() call will give the desired result:
SQL> select name 2 , greatest(m1, m2, m3, m4) as the greatest_m 3 from your_table 4 / NAME THE_GREATEST_M ---- -------------- A 4 B 6 C 5 SQL>
Note that greatest() will return NULL if any of the arguments are null. If this is a problem then use nvl() to provide a default value which won't distort the outcome. For instance, if no values can be negative....
SQL> select name 2 , greatest(nvl(m1,0), nvl(m2,0), nvl(m3,0), nvl(m4,0)) as the greatest_m 3 from your_table 4 / NAME THE_GREATEST_M ---- -------------- A 4 B 6 C 5 SQL>