-- 대충 만들어봤습니다. WITH T (GB,A,B,C)AS ( SELECT '그룹A' , '가' ,'' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '나' ,'' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '다' ,'' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '' ,'라' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '' ,'마' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '' ,'바' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '' ,'사' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '' ,'아' ,'' FROM DUAL UNION ALL SELECT '그룹A' , '' ,'' ,'자' FROM DUAL UNION ALL SELECT '그룹B' , 'A' ,'' ,'' FROM DUAL UNION ALL SELECT '그룹B' , '' ,'B' ,'' FROM DUAL ) SELECT RN , GB , MIN(A) A , MIN(B) B , MIN(C) C FROM ( SELECT T.* , LEAST( ROW_NUMBER() OVER(PARTITION BY GB ORDER BY A ) , ROW_NUMBER() OVER(PARTITION BY GB ORDER BY B ) , ROW_NUMBER() OVER(PARTITION BY GB ORDER BY C ) ) RN FROM T ) GROUP BY GB , RN ORDER BY GB , RN
-- 11G -- SELECT * FROM (SELECT gb, gb1, v , ROW_NUMBER() OVER(PARTITION BY gb, gb1 ORDER BY v) rn FROM t UNPIVOT (v FOR gb1 IN (a, b, c)) ) PIVOT (MIN(v) FOR gb1 IN ('A' a, 'B' b, 'C' c)) ORDER BY gb, rn ;
-- 10G -- SELECT gb , MIN(a) a , MIN(b) b , MIN(c) c FROM (SELECT gb, a, b, c , ROW_NUMBER() OVER( PARTITION BY gb, CASE WHEN a IS NOT NULL THEN 1 WHEN b IS NOT NULL THEN 2 WHEN c IS NOT NULL THEN 3 END ORDER BY a, b, c ) rn FROM t ) GROUP BY gb, rn ORDER BY gb, rn ;