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 38771 게시물 읽기
No. 38771
wm_concat 의 정렬 문의좀 드릴게요...
작성자
박수길(sookill)
작성일
2011-08-11 10:06
조회수
12,394

with tbl as

(
    select 1 seq , '20110801' ymd, 't' gubun, 'input1' title from dual
    union select 2 seq , '20110802' ymd, 't' gubun, 'input2' title from dual
    union select 3 seq , '20110802' ymd, 't' gubun, 'input3' title from dual
    union select 4 seq , '20110802' ymd, 't' gubun, 'input4' title from dual
    union select 5 seq , '20110802' ymd, 't' gubun, 'input5' title from dual
    union select 6 seq , '20110804' ymd, 'c' gubun, 'input6' title from dual
)
select
    ymd,wm_concat(seq||'||'||title) as seq_title
from
    tbl
group by ymd

제가 할려는게 같은 날짜의 title 를 seq 순서대로 뽑아내는건대요

위에 쿼리를 돌려보면

20110801    1||input1
20110802    2||input2,4||input4,5||input5,3||input3   <== 여기가 문제임
20110804    6||input6

 

이런식으로 나옵니다. 즉 2,3,4,5 이런순으로 나와야 하는대 엉뚱하게 3이 젤 나중에 나와버립니다.

어떻게 해야 할까요? 도움 주시면 감사하겠습니다...

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

wm_concat 간단하면서도 강력한 기능 정말 좋은데...
한가지 아쉬운 점이 정렬 기능이 없다는 거죠...
XmlAgg(9i) 나 ListAgg(11g) 를 이용하시면 됩니다.

SELECT ymd
     , SUBSTR(XMLAGG(XMLELEMENT(x, ',', seq, '||', title) ORDER BY seq)
       .EXTRACT('//text()'), 2) v_9i
     , wm_concat(seq||'||'||title) v_10g
     , LISTAGG(seq||'||'||title, ',') WITHIN GROUP(ORDER BY seq) v_11g
  FROM tbl
 GROUP BY ymd
 ORDER BY ymd
;

wm_concat를 이용해 정렬하고자 한다면..
인라인뷰에서 분석함수의 정렬기능을 이용하신후 밖에서 걸러내시면 됩니다.

SELECT ymd
     , seq_title
  FROM (SELECT ymd, seq
             , wm_concat(seq||'||'||title)
               OVER(PARTITION BY ymd ORDER BY seq) seq_title
             , MAX(seq) OVER(PARTITION BY ymd) max_seq
          FROM tbl
        )
 WHERE seq = max_seq
 ORDER BY ymd
;

Connect_By_Path(9i)를 이용하는 방법도 있는데 더 복잡하고 성능도 안좋아요.

SELECT ymd
     , SUBSTR(SYS_CONNECT_BY_PATH(seq||'||'||title, ','), 2) seq_title
  FROM (SELECT ymd, seq, title
             , ROW_NUMBER() OVER(PARTITION BY ymd ORDER BY seq) rn
             , COUNT(*) OVER(PARTITION BY ymd) cnt
          FROM tbl
        )
 WHERE rn = cnt
 START WITH rn = 1
 CONNECT BY PRIOR ymd = ymd
        AND PRIOR rn + 1 = rn
;

마농(manon94)님이 2011-08-11 11:27에 작성한 댓글입니다.
이 댓글은 2011-08-11 11:27에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
38775decode 문 안에서 정렬 [2]
박주영
2011-08-11
4517
38774키가 없는 테이블 업데이트하기... [2]
나초보
2011-08-11
3804
38772두개의 문자열 비교하여, 위치별 틀린 갯수 구하기 [3]
dol
2011-08-11
5169
38771wm_concat 의 정렬 문의좀 드릴게요... [1]
박수길
2011-08-11
12394
38769정렬(order by) 문의 [1]
채종식
2011-08-10
3482
38768캘린터 형태의 예약일정을 표시하려고 하는대 좀 도와주세요... [2]
박수길
2011-08-10
4945
38766테이블스페이스 삭제가 안되네요 [1]
백상옥
2011-08-10
3198
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다