계층구조를 유지하면서 Sort관련 문의 드립니다. 1 12 767

by 동동동 [SQL Query] [2018.08.31 15:39:24]


아..아무리 머리를 쥐어짜도 해답을 못찾겠네요..

마농님의 도움으로 계층구조까지는 표현이 가능한데..

저 계층구조로 뽑은 이후 데이타를 코드나 이름순으로 자유롭게 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

 

도움 부탁드립니다.

by 우리집아찌 [2018.08.31 15:47:16]
-- 답에만 맞춥니다.
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
;

 


by 동동동 [2018.08.31 16:55:22]

답변감사드립니다..


by 마농 [2018.08.31 16:14:08]
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, cod) ASC, lvl
-- ORDER BY NVL(grpcod, cod) DESC, lvl
;

 


by 동동동 [2018.08.31 16:56:12]

답변감사드립니다..아..머릿속이 하애지네요..


by 동동동 [2018.09.03 09:11:19]
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가 원활히 되지 않는것 같습니다..ㅠㅠ

 


by 마농 [2018.09.04 08:38:36]

뭐가 어떻게 안되는지 구체적으로 질문해 주세요.
그리고, 지난번 질문에 lvl 이 없어서 만드는 방법을 알려드린건데?
지금 질문을 다시보니 lvl 항목이 있네요?
있으면 만들어낼 필요가 없는데?
lvl 이 있는건가요? 없는건가요?


by 동동동 [2018.09.04 12:54:12]
답변 감사드립니다..
지난번 레벨만드는 법을 적용한 데이타가 이렇게 나왔을시 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

 

답글 주셔서 감사드립니다..

 


by 마농 [2018.09.04 13:10:20]
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
;

 


by 동동동 [2018.09.06 09:53:14]

마농님 답변 감사드립니다...제가 너무 무지해서 이해가 안가네요..ㅠㅠ

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

 


by 마농 [2018.09.06 10:00:14]

위에 채택하신게 코드별인데요???

질문이 모호합니다.
코드별, 코드명별 정렬 이란 표현을 하셨지만?
실제로 원하시는 것은 그룹코드별, 그룹코드명별 정렬입니다.
grpcod 가 그룹코드이지만 널값등이 있어서
NVL(grpcod, cod) 한것이 실질적인 그룹코드이구요.
해당 그룹코드에 대한 그룹코드명칭은 아래 구문으로 구하는 것입니다.
MIN(DECODE(NVL(grpcod, cod), cod, codnm)) OVER(PARTITION BY NVL(grpcod, cod))


by 마농 [2018.09.06 10:41:33]
-- 이해를 돕기 위해 인라인뷰를 사용했습니다.
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  -- 그룹명칭 역방향 정렬(명칭은 중복 가능하므로 코드도 추가)
;

 


by 동동동 [2018.09.06 11:27:24]

답글 감사드립니다...

그룹코드는 단순 레벨을 구하기위한 값인데요...

좀더 파봐야 겠네요....감사합니다...

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