database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38663 게시물 읽기
No. 38663
같은 레벨의 행인경우 순서 바꾸기
작성자
황순원(prio97)
작성일
2011-07-05 20:49
조회수
5,967

안녕하세요...

해볼려고 머리를 쥐어 짜봐도 답이 안나와서 한수 배워보고자 고수님들께 도움요청합니다..

테이블이 아래처럼 있습니다.

 

SRVC_ID sort_key
srvc01 2
srvc0101 2
srvc010101 3
srvc010102 2
srvc010103 1
srvc0102 1
srvc02 1
srvc0201 2
srvc020101 2
srvc020102 1
srvc0202 1

이거를 아래처럼 나오게 하고 싶습니다.

SRVC_ID sort_key
srvc01 2
srvc0101 2
srvc010103 1
srvc010102 2
srvc010101 3
srvc0102 1
srvc02 1
srvc0201 2
srvc020102 1
srvc020101 2
srvc0202 1

설명을 드리면..빨간색 행의 데이타가 바뀌져서 나오는 부분인데요.

기본 SORT 는 SRVC_ID 인데

같은 레벨 ( SRVC_ID길이 ) 의 SRVC_ID가 연속적으로 나오는 경우는 순서를 SORT_KEY로 나오도록 하는것입니다.

고수님들의 의견 부탁 드리겠습니다. ^^:

이 글에 대한 댓글이 총 3건 있습니다.

혹시 원하시는게 이런게 아닐런지요?
빨간부분만 소트해서 될게 아니란 생각이 듭니다.
전체적으로 레벨별 소트를 해야 하지 않을까요?

WITH t AS
(
SELECT 'srvc01' srvc_id, 2 sort_key FROM dual
UNION ALL SELECT 'srvc0101'  , 2 FROM dual
UNION ALL SELECT 'srvc010101', 3 FROM dual
UNION ALL SELECT 'srvc010102', 2 FROM dual
UNION ALL SELECT 'srvc010103', 1 FROM dual
UNION ALL SELECT 'srvc0102'  , 1 FROM dual
UNION ALL SELECT 'srvc02'    , 1 FROM dual
UNION ALL SELECT 'srvc0201'  , 2 FROM dual
UNION ALL SELECT 'srvc020101', 2 FROM dual
UNION ALL SELECT 'srvc020102', 1 FROM dual
UNION ALL SELECT 'srvc0202'  , 1 FROM dual
)
SELECT LEVEL lv
     , srvc_id
     , sort_key
  FROM t
 START WITH LENGTH(srvc_id) = 6
 CONNECT BY srvc_id LIKE PRIOR srvc_id || '__'
 ORDER SIBLINGS BY sort_key
;

마농(manon94)님이 2011-07-06 09:31에 작성한 댓글입니다.

ORDER SIBLINGS BY srvc_id, sort_key

복권인생님이 2011-07-06 09:53에 작성한 댓글입니다. Edit

원하시는 결과가 최초 설명하신게 맞다면?
같은 레벨 연속인 경우에만 순서를 조정한다면
그러나, 다음과 같은 예시자료를 만난다면 데이터가 이상하게 꼬이게 됩니다.
즉, 2레벨의 순서가 조정되면서 3레벨은 2레벨을 쫒아가야 하는데 그게 안되죠.


WITH t AS
(
SELECT 'srvc01' srvc_id, 2 sort_key FROM dual
UNION ALL SELECT 'srvc0101'  , 2 FROM dual
UNION ALL SELECT 'srvc0102'  , 1 FROM dual
UNION ALL SELECT 'srvc010201', 3 FROM dual
UNION ALL SELECT 'srvc010202', 2 FROM dual
UNION ALL SELECT 'srvc010203', 1 FROM dual
)
SELECT srvc_id
     , sort_key
  FROM (SELECT srvc_id
             , sort_key
             , DECODE(LENGTH(srvc_id)
             , LAG(LENGTH(srvc_id)) OVER(ORDER BY srvc_id)
             , 0, 1) flag
          FROM t
         ORDER BY srvc_id
        )
 ORDER BY SUM(flag) OVER(ORDER BY srvc_id)
        , sort_key
;

마농(manon94)님이 2011-07-06 11:12에 작성한 댓글입니다.
이 댓글은 2011-07-06 11:19에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
38666주별 테이터를 월별로 변환 쿼리를 부탁 드립니다. [6]
성보현
2011-07-06
5899
38665[질문] 가끔씩 ora-12560 TNS 프로토콜 오류?
질문
2011-07-06
4586
38664컬럼 업데이트 시간알수 있을까요?
질럿
2011-07-06
3682
38663같은 레벨의 행인경우 순서 바꾸기 [3]
황순원
2011-07-05
5967
38662테이블스페이스 권한 관련 질문 드립니다. [1]
당근
2011-07-05
3886
38661조건에 따라 정렬 [3]
바램
2011-07-05
4281
38660PL/SQL - 트리거 질문
박제권
2011-07-05
6298
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다