데이터 조합 쿼리 좀 도와주세요. 0 9 1,447

by DB사랑 [SQL Query] 데이터 조합 쿼리 [2015.05.19 10:00:02]


다음과 같은 데이터가 있습니다.

WITH TEST AS
(
SELECT '1' ORD, 'CHAR' GRP, 'A' code FROM dual
UNION ALL SELECT '1' ORD,'CHAR' GRP, 'B' code FROM dual
UNION ALL SELECT '1' ORD,'CHAR' GRP, 'C' code FROM dual
UNION ALL SELECT '2' ORD,'NUM' GRP, '1' code FROM dual
UNION ALL SELECT '2' ORD,'NUM' GRP, '2' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '일' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '이' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '삼' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '사' code FROM dual
)

ORD 순으로 GRP별로 CODE 조합 데이터를 출력하고 싶습니다.

출력:

CODE

A-1-일

A-1-이

A-1-삼

A-1-사

A-2-일

A-2-이

A-2-삼

A-2-사

B-1-일

B-1-이

B-1-삼

B-1-사

B-2-일

B-2-이

B-2-삼

B-2-사

C-1-일

C-1-이

C-1-삼

C-1-사

C-2-일

C-2-이

C-2-삼

C-2-사

여기저기 찾아봤는데, 저렇게는 되질 않아서. 고수님들의 고견 부탁드립니다.

by jkson [2015.05.19 10:19:23]
WITH TEST AS
(
SELECT '1' ORD, 'CHAR' GRP, 'A' code FROM dual
UNION ALL SELECT '1' ORD,'CHAR' GRP, 'B' code FROM dual
UNION ALL SELECT '1' ORD,'CHAR' GRP, 'C' code FROM dual
UNION ALL SELECT '2' ORD,'NUM' GRP, '1' code FROM dual
UNION ALL SELECT '2' ORD,'NUM' GRP, '2' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '일' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '이' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '삼' code FROM dual
UNION ALL SELECT '3' ORD,'KOR' GRP, '사' code FROM dual
)
SELECT a.code || '-' || b.code || '-' || c.code code
  FROM (SELECT *
          FROM TEST
         WHERE ord = 1) a
     , (SELECT *
          FROM TEST
         WHERE ord = 2) b
     , (SELECT *
          FROM TEST
         WHERE ord = 3) c

일, 이, 삼, 사 같은 경우에는 그냥 소트하면 한글 순이기 때문에 이것에 대한 처리를 좀 해주셔야할 것 같네요.


by DB사랑 [2015.05.19 10:40:30]

감사합니다. 아래 마농님 쿼리로 해결하였습니다.


by DarkBee [2015.05.19 10:20:46]
SELECT a.code || '-' || a.ord || '-' || b.code
  FROM test a
     , test b

 


by DB사랑 [2015.05.19 10:40:50]

감사합니다. 아래 마농님 쿼리로 해결하였습니다.


by 마농 [2015.05.19 10:28:19]
SELECT SUBSTR(SYS_CONNECT_BY_PATH(code, '-'), 2) x
  FROM test
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH ord = 1
 CONNECT BY PRIOR ord + 1 = ord
;

 


by DB사랑 [2015.05.19 10:39:35]

어제부터 고민하던 건데, 감사합니다.


by DarkBee [2015.05.19 10:31:08]
 SELECT CONNECT_BY_ROOT ( code ) || '-' || PRIOR code || '-' || code
   FROM test
  WHERE CONNECT_BY_ISLEAF = 1
  START WITH ord = 1
CONNECT BY PRIOR ord = ord - 1

 


by DB사랑 [2015.05.19 10:41:05]

감사합니다.


by 초보초보 [2015.07.08 15:37:38]

WITH TEST AS
 (
 SELECT '1' ORD, 'CHAR' GRP, 'A' code FROM dual
 UNION ALL SELECT '1' ORD,'CHAR' GRP, 'B' code FROM dual
 UNION ALL SELECT '1' ORD,'CHAR' GRP, 'C' code FROM dual
 UNION ALL SELECT '2' ORD,'NUM' GRP, '1' code FROM dual
 UNION ALL SELECT '2' ORD,'NUM' GRP, '2' code FROM dual
 UNION ALL SELECT '3' ORD,'KOR' GRP, '일' code FROM dual
 UNION ALL SELECT '3' ORD,'KOR' GRP, '이' code FROM dual
 UNION ALL SELECT '3' ORD,'KOR' GRP, '삼' code FROM dual
 UNION ALL SELECT '3' ORD,'KOR' GRP, '사' code FROM dual
 )
 select c.code||'-'||n.code||'-'||k.code
 from
 (select
 grp,code
 from test
 where grp='CHAR') c,
 (select
 grp,code
 from test
 where grp='NUM') n,
 (select
 grp,code
 from test
 where grp='KOR') k
 order by c.code,n.code,k.code;
 
 

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