WITH t AS ( SELECT '' c1, '' c2, 'A' c3, '' c4 FROM dual UNION ALL SELECT 'A', '', '', 'A' FROM dual UNION ALL SELECT 'A', '', '', '' FROM dual ) SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY gb ORDER BY 1) rn , gb, c FROM t UNPIVOT (c FOR gb IN (c1, c2, c3, c4)) ) PIVOT (MIN(c) FOR gb IN ('C1' c1, 'C2' c2, 'C3' c3, 'C4' c4)) ;