Пока Main / SUB существуют ровно один раз в строке:
select ID, Cat1 as MainCategory, Cat2 as Cat1, Cat3 as Cat2, Cat4 as Cat3
from tablename where Cat1 in ('Main', 'SUB')
UNION ALL
select ID, Cat2, Cat1, Cat3, Cat4
from tablename where Cat2 in ('Main', 'SUB')
UNION ALL
select ID, Cat3, Cat1, Cat2, Cat4
from tablename where Cat3 in ('Main', 'SUB')
UNION ALL
select ID, Cat4, Cat1, Cat2, Cat3
from tablename where Cat4 in ('Main', 'SUB')
-- To include rows without both Main and SUB, add
UNION ALL
select ID, Cat1, Cat2, Cat3, Cat4
from tablename
where Cat1 not in ('Main', 'SUB')
and Cat2 not in ('Main', 'SUB')
and Cat3 not in ('Main', 'SUB')
and Cat4 not in ('Main', 'SUB')