Oracle 여러행을 한 열로 합치는 것 XMLAGG, XMLELEMENT 질문이요 0 4 3,550

by 자이제시작이야 [SQL Query] [2017.12.08 14:46:42]


select  A.key , 


-- (1) XMLAGG(XMLELEMENT(X, ' ', B.SENTENCE ) order by B.time).EXTRACT('//text()').GETSTRINGVAL() AS SENTENCE
-- (2) XMLAGG(XMLELEMENT(X,' ' , B.SENTENCE ) order by B.time).EXTRACT('//text()').GETCLOBVAL() AS SENTENCE

from A , B
where A.KEY = B.KEY
and A.DATE between '20161208' and '20171208'
group by A.KEY;

 

A테이블은 KEY, DATE, ID

B테이블은 KEY,

SENTENCE(한문장이 끝나면 다음문장은 다음행에 쌓이는 식),

TIME(시간이 아닌 SENTENCE 순서구분용) 가 있어요

 

A테이블

KEY                 DATE               ID

abc110             20171110        hong

abc555             20170612        dong

      :                     :                 :

B테이블

KEY                 SENTENCE                                        TIME

abc110            안녕하세요                                        1

abc110            질문이 있어서 이렇게 글을 올립니다       2

abc110            친절한 답변 부탁드립니다                     3

     :                               :                                       :

abc555             데이터베이스 공부하는 사람입니다         1

abc555             어렵지만 관심 가지고 하고 있습니다       2

abc555             도와주시면 감사하겠습니다                   3

     :                                  :                                      :

 

1년치의 데이터를 뽑아서 B테이블에 있는 SENTENCE의 행들을 하나의 열로 만들고 싶어서 해봤는데

 

(1)은 ORA-06502, ORA-06512 에러가 나고

(2)는 40자 제한에서 짤려요..

 

도와주세요~

 

by jkson [2017.12.08 16:34:13]

2번 잘 되는데요?

with t as
(
select 'abc110' key, '안녕하세요'                  sentence , 1 time from dual union all
select 'abc110' key, '질문이 있어서 이렇게 글을 올립니다'   sentence , 2 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc110' key, '친절한 답변 부탁드립니다'         sentence , 3 time from dual union all
select 'abc555' key, '데이터베이스 공부하는 사람입니다'     sentence , 1 time from dual union all
select 'abc555' key, '어렵지만 관심 가지고 하고 있습니다'   sentence , 2 time from dual union all
select 'abc555' key, '도와주시면 감사하겠습니다'         sentence , 3 time from dual
)
select substr(xmlagg(xmlelement(x,' ' , sentence ) order by time).extract('//text()').getclobval(),2) as sentence
from t
group by key

--결과
안녕하세요 질문이 있어서 이렇게 글을 올립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다
데이터베이스 공부하는 사람입니다 어렵지만 관심 가지고 하고 있습니다 도와주시면 감사하겠습니다

 


by 자이제시작이야 [2017.12.08 17:37:01]

 

SUBSTR(XMLAGG(XMLELEMENT(X,' ' , B.SENTENCE ) order by B.time).EXTRACT('//text()').GETCLOBVAL(),2) AS SENTENCE

이렇게 해봐도 저는 짤리네요...ㅠ 

 

위에꺼 긁어서 orange for oracle에서 해봤는데

똑같이 짤리네요

그래서 getCLOBval 을 getSTRINGval로 했더니 안짤리고 

안녕하세요 질문이 있어서 이렇게 글을 올립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다 친절한 답변 부탁드립니다

이렇게 나왔어요...

뭐가 잘못된걸까요..


by 마농 [2017.12.08 17:46:12]

짤린다는게...
아마도 CLOB 이라서 일부만 보여주고 나머지 부분은 ... 처리한게 아닐까요?
실제로는 정상처리되었을 것 같네요.


by 자이제시작이야 [2017.12.08 18:06:21]

아항... 확인해 보겠습니다~

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