열을 행으로 변환 혹은 조인 후 정렬 질문드립니다. 1 5 1,845

by 달 [SQL Query] [2015.02.25 20:28:32]


안녕하세요.
뭔가 가능할것 같은데..영 안풀려서 문의드립니다.
간단히 짝꿍신청이라고 생각하시면 되고
신청한 사람끼리 짝꿍을 맺어줄려고 하는데요.
짝사랑은 안되고 서로서로 신청을 해야만 짝꿍이 됩니다.

A -> C
B -> C
C -> B
D -> E
E -> D
신청을 했다면

아래와 같이 추출 하고 싶습니다.

----------------------
짝꿍구분값   |  ID  | 성명
----------------------
1             |  B   | 가가가
1             |  C   | 나나나
2             |  D   | 다다다
2             |  E   | 라라라

 


WITH t AS
(
  SELECT '1111' no, '홍길동' kornm, '5555' mate_no, '김철수' mate_kornm  FROM dual
  UNION ALL
  SELECT '2222', '이철수', '3333', '홍길남' FROM dual
  UNION ALL
  SELECT '4444', '홍길북', '1111', '박철수' FROM dual
  UNION ALL
  SELECT '3333', '홍길남', '2222', '이철수' FROM dual
  UNION ALL
  SELECT '5555', '김철수', '1111', '홍길동' FROM dual
)
SELECT * from t
--SELECT * from t a,t b
--where a.no=b.mate_no
;

 

no 컬럼은 신청한 사람의 ID,
kornm 컬럼은 신청한 사람 성명,
mate_no 상대방의 ID,
mate_kornm 컬럼은 상대방의 성명입니다.

아래와 같이 추출 하고 싶습니다.

구분값 | no | 성명

    1   1111   홍길동

    1   5555   김철수

    2   2222   이철수

    2   3333   홍길남

저는 단순하게 조인해서 정렬을 해볼까 했는데..짝꿍끼리 연달아 나오지 않고 떨어져 나오니깐

짝궁인지 알아보기도 힘드네요 ㅎㅎㅎ

그래서 열을 행으로 바꾸면 될것 같기도 하고..

도움 부탁드립니다.

 

 

 

by 우리집아찌 [2015.02.26 01:04:50]
-- 비슷하게만..
SELECT 
  A.NO , A.KORNM , GREATEST( A.NO , B.NO ) 
FROM T A , T B
 WHERE A.NO = B.MATE_NO
   AND B.NO = A.MATE_NO 
ORDER BY  GREATEST( A.NO , B.NO ) 

 


by 우리집아찌 [2015.02.27 15:14:41]
WITH t AS
(
  SELECT '1111' no, '홍길동' kornm, '5555' mate_no, '김철수' mate_kornm  FROM dual
  UNION ALL
  SELECT '2222', '이철수', '3333', '홍길남' FROM dual
  UNION ALL
  SELECT '4444', '홍길북', '1111', '박철수' FROM dual
  UNION ALL
  SELECT '3333', '홍길남', '2222', '이철수' FROM dual
  UNION ALL
  SELECT '5555', '김철수', '1111', '홍길동' FROM dual
)
  
  SELECT 
     NUM 
   , DECODE(LV,1,NO1,2,NO2) N0
   , DECODE(LV,1,NM1,2,NM2) NM 
   
  FROM
  (
  SELECT
    ROW_NUMBER() OVER(ORDER BY NULL) NUM
   ,GRP
   ,MAX(DECODE(RN,1,KORNM)) NM1
   ,MAX(DECODE(RN,2,KORNM)) NM2
   ,MAX(DECODE(RN,1,NO)) NO1
   ,MAX(DECODE(RN,2,NO)) NO2
  FROM
  (
    SELECT
      A.NO , A.KORNM 
    , LEAST( A.NO , B.NO ) AS GRP
    , ROW_NUMBER() OVER(PARTITION BY LEAST( A.NO , B.NO ) ORDER BY NULL )  RN
    FROM T A , T B
     WHERE A.NO = B.MATE_NO
       AND B.NO = A.MATE_NO 
   )
  GROUP BY GRP
 ) , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <=2 )  

 ORDER BY GRP , DECODE(LV,1,NO1,2,NO2) 

 


by 마농 [2015.02.27 15:59:10]
-- 1. Self 조인 후 Dense_rank
SELECT DENSE_RANK() OVER(ORDER BY LEAST(a.no, a.mate_no)) dr
     , a.no, a.kornm
  FROM t a
     , t b
 WHERE a.no = b.mate_no
   AND b.no = a.mate_no
 ORDER BY dr, no
;
-- 2. 계층쿼리의 NoCycle 과 Connect_by_isCycle 기능 이용
SELECT DENSE_RANK() OVER(ORDER BY LEAST(no, mate_no)) dr
     , no, kornm
  FROM t
 WHERE CONNECT_BY_ISCYCLE = 1
 CONNECT BY NOCYCLE PRIOR no = mate_no
 ORDER BY dr, no
;

 


by 우리집아찌 [2015.02.27 16:19:45]

아..


by 달 [2015.03.03 00:23:34]

우리집아찌님,마농님 감사합니다~

좋은일만 가득하시길~

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입