아..아무리 머리를 쥐어짜도 해답을 못찾겠네요..
마농님의 도움으로 계층구조까지는 표현이 가능한데..
저 계층구조로 뽑은 이후 데이타를 코드나 이름순으로 자유롭게 Sort한다고 했을때..
계층구조를 유지하면서 Sort를 하려면 어떤 값이 추가로 있으면 가능할지 답을 찾습니다..ㅠㅠ
WITH TMP AS ( SELECT 'A' COD, '가나다' CODNM, 'A' GRPCOD, 2 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'A2' COD, 'AAAAA' CODNM, 'A' GRPCOD, 4 SEQ, 2 LVL FROM DUAL UNION ALL SELECT 'B' COD, '하하하' CODNM, '' GRPCOD, 3 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'C' COD, 'qkqqqq' CODNM, '' GRPCOD, 5 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'A1' COD, '하하하' CODNM, 'A' GRPCOD, 1 SEQ, 1 LVL FROM DUAL ) SELECT cod, codnm, grpcod, seq , ROW_NUMBER() OVER(PARTITION BY NVL(grpcod, cod) ORDER BY DECODE(grpcod, cod, 0, seq)) - 1 lvl FROM tmp ;
코드순 Asc Sort
COD | CODNM | GRPCOD | SEQ | LVL |
A | 가나다 | A | 2 | 0 |
A1 | 하하하 | A | 1 | 1 |
D | AAAAA | A | 4 | 2 |
B | 하하하 | {NULL} | 3 | 0 |
C | qkqqqq | {NULL} | 5 | 0 |
코드순 Desc
COD | CODNM | GRPCOD | SEQ | LVL |
C | qkqqqq | {NULL} | 5 | 0 |
B | 하하하 | {NULL} | 3 | 0 |
A | 가나다 | A | 2 | 0 |
A1 | 하하하 | A | 1 | 1 |
D | AAAAA | A | 4 | 2 |
도움 부탁드립니다.
-- 답에만 맞춥니다. WITH TMP AS ( SELECT 'A' COD, '가나다' CODNM, 'A' GRPCOD, 2 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'A2' COD, 'AAAAA' CODNM, 'A' GRPCOD, 4 SEQ, 2 LVL FROM DUAL UNION ALL SELECT 'B' COD, '하하하' CODNM, '' GRPCOD, 3 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'C' COD, 'qkqqqq' CODNM, '' GRPCOD, 5 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'A1' COD, '하하하' CODNM, 'A' GRPCOD, 1 SEQ, 1 LVL FROM DUAL ) SELECT cod, codnm, grpcod, seq , ROW_NUMBER() OVER(PARTITION BY NVL(grpcod, cod) ORDER BY DECODE(grpcod, cod, 0, seq)) - 1 lvl FROM tmp ORDER BY LVL , SEQ DESC ;
WITH TMP AS ( SELECT 'A' COD, '가나나' CODNM, 'A' GRPCOD, 2 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'AA' COD, 'BBBBB' CODNM, 'A' GRPCOD, 6 SEQ, 1 LVL FROM DUAL UNION ALL SELECT 'D' COD, 'AAAAA' CODNM, 'B' GRPCOD, 4 SEQ, 2 LVL FROM DUAL UNION ALL SELECT 'B' COD, '나나나' CODNM, 'B' GRPCOD, 3 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'C' COD, '가나나' CODNM, '' GRPCOD, 5 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'A1' COD, '하하하' CODNM, 'B' GRPCOD, 1 SEQ, 1 LVL FROM DUAL ) SELECT cod, codnm, grpcod, seq , ROW_NUMBER() OVER(PARTITION BY NVL(grpcod, cod) ORDER BY DECODE(grpcod, cod, 0, seq)) - 1 lvl FROM tmp -- ORDER BY NVL(grpcod, CODNM) ASC, lvl ORDER BY NVL(grpcod, CODNM) DESC, lvl ; 마농님..명칭 또는 코드로의 Sort가 원활히 되지 않는것 같습니다..ㅠㅠ
답변 감사드립니다.. 지난번 레벨만드는 법을 적용한 데이타가 이렇게 나왔을시 Sort하는 방법 문의 입니다.. 레벨만드는 방법 에 의해 LVL이라는 칼럼이 이렇게 채워졌을때 Cod 또는 CodNm으로 Sort를 할시 레벨이 유지되면서 Sort가 되는 방법이 궁금합니다.. WITH TMP AS ( SELECT 'A' COD, '가나나' CODNM, 'A' GRPCOD, 2 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'AA' COD, 'BBBBB' CODNM, 'A' GRPCOD, 6 SEQ, 1 LVL FROM DUAL UNION ALL SELECT 'D' COD, 'AAAAA' CODNM, 'B' GRPCOD, 4 SEQ, 2 LVL FROM DUAL UNION ALL SELECT 'B' COD, '나나나' CODNM, 'B' GRPCOD, 3 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'C' COD, '가나가' CODNM, '' GRPCOD, 5 SEQ, 0 LVL FROM DUAL UNION ALL SELECT 'A1' COD, '하하하' CODNM, 'B' GRPCOD, 1 SEQ, 1 LVL FROM DUAL ) SELECT cod, codnm, grpcod, seq , ROW_NUMBER() OVER(PARTITION BY NVL(grpcod, cod) ORDER BY DECODE(grpcod, cod, 0, seq)) - 1 lvl FROM tmp -- ORDER BY NVL(grpcod, CODNM) ASC, lvl ORDER BY NVL(grpcod, CODNM) DESC, lvl ;
실제 결과
COD | CODNM | GRPCOD | SEQ | LVL |
C | 가나가 | 5 | 0 | |
B | 나나나 | B | 3 | 0 |
A1 | 하하하 | B | 1 | 1 |
D | AAAAA | B | 4 | 2 |
A | 가나나 | A | 2 | 0 |
AA | BBBBB | A | 6 | 1 |
원하는 결과
COD | CODNM | GRPCOD | SEQ | LVL |
B | 나나나 | B | 3 | 0 |
A1 | 하하하 | B | 1 | 1 |
D | AAAAA | B | 4 | 2 |
C | 가나가 | 5 | 0 | |
A | 가나나 | A | 2 | 0 |
AA | BBBBB | A | 6 | 1 |
답글 주셔서 감사드립니다..
WITH tmp AS ( SELECT 'A' cod, '가나나' codnm, 'A' grpcod, 2 seq FROM dual UNION ALL SELECT 'AA', 'BBBBB' , 'A', 6 FROM dual UNION ALL SELECT 'D' , 'AAAAA' , 'B', 4 FROM dual UNION ALL SELECT 'B' , '나나나', 'B', 3 FROM dual UNION ALL SELECT 'C' , '가나가', '' , 5 FROM dual UNION ALL SELECT 'A1', '하하하', 'B', 1 FROM dual ) SELECT cod, codnm, grpcod, seq , ROW_NUMBER() OVER(PARTITION BY NVL(grpcod, cod) ORDER BY DECODE(grpcod, cod, 0, seq)) - 1 lvl FROM tmp ORDER BY MIN(DECODE(NVL(grpcod, cod), cod, codnm)) OVER(PARTITION BY NVL(grpcod, cod)) DESC , NVL(grpcod, cod) -- 이게 기준이므로 이걸 고치면 안되요.(위에 별도 codnm 추가) , lvl ;
마농님 답변 감사드립니다...제가 너무 무지해서 이해가 안가네요..ㅠㅠ
COD별 또는 CODNM별로 Sort를 하고 싶으면 어떤부분을 봐야 하는지 이해하지 못했습니다..ㅠㅠ
답글 주신부분은 CODNM별 Sort인데..COD로 하고 싶다면 어떻게 하는것인지..죄송합니다...ㅠㅠ
ORDER BY MIN(DECODE(NVL(grpcod, cod), cod, codnm)) OVER(PARTITION BY NVL(grpcod, cod)) DESC
, NVL(grpcod, cod) -- 이게 기준이므로 이걸 고치면 안되요.(위에 별도 codnm 추가)
, lvl
-- 이해를 돕기 위해 인라인뷰를 사용했습니다. SELECT * FROM (SELECT cod, codnm, grpcod, seq , NVL(grpcod, cod) grp_cd -- 그룹코드 , MIN(DECODE(NVL(grpcod, cod), cod, codnm)) OVER(PARTITION BY NVL(grpcod, cod)) grp_nm -- 그룹명칭 , ROW_NUMBER() OVER(PARTITION BY NVL(grpcod, cod) ORDER BY DECODE(grpcod, cod, 0, seq)) - 1 lvl FROM tmp ) ORDER BY grp_cd ASC, lvl -- 그룹코드 순방향 정렬 ORDER BY grp_cd DESC, lvl -- 그룹코드 역방향 정렬 ORDER BY grp_nm ASC, grp_cd, lvl -- 그룹명칭 순방향 정렬(명칭은 중복 가능하므로 코드도 추가) ORDER BY grp_nm DESC, grp_cd, lvl -- 그룹명칭 역방향 정렬(명칭은 중복 가능하므로 코드도 추가) ;