결과를 집계 해야하는데.. 0 6 1,036

by armadillo [SQL Query] 집계 [2017.09.11 21:42:34]


반갑습니다.

데이타를 집계 해야하는데...
고민을 해봐도 방향을 못잡아 이렇게 질문드립니다.
-- 데이타 
with t01 as (
select '03' id, '1' step from dual union all
select '03' id, '2' step from dual union all
select '03' id, '1' step from dual union all
select '03' id, '2' step from dual union all
select '04' id, '1' step from dual union all
select '04' id, '2' step from dual union all
select '04' id, '1' step from dual union all
select '05' id, '1' step from dual union all
select '05' id, '2' step from dual union all
select '05' id, '3' step from dual)
select *
from t01
;

-- 현재 데이타
ID	STEP
03	1
03	2
03	1
03	2
04	1
04	2
04	1
05	1
05	2
05	3

--원하는 형태
ID STEP
03  1,2
03  1,2
04  1,2
04  1
05  1,2,3

즉  id 별로 step값이 순서대로 나오는데, 
id별 step 1을 기준으로 최대값까지 하나의 로우를 만드는 것인데..

로우의 갯수가 부정형이다보니 답을 구하기 어렵네요.
동일한 id로 그룹핑도 못하고...
고민을 해봐도 진전이 없어 이렇게 질문드립니다.

선배님들의 조언 부탁드립니다.

감사합니다.

by jkson [2017.09.12 08:01:43]
with t01 as (
select '03' id, '1' step from dual union all
select '03' id, '2' step from dual union all
select '03' id, '1' step from dual union all
select '03' id, '2' step from dual union all
select '04' id, '1' step from dual union all
select '04' id, '2' step from dual union all
select '04' id, '1' step from dual union all
select '05' id, '1' step from dual union all
select '05' id, '2' step from dual union all
select '05' id, '3' step from dual)
select id, listagg(step,',') within group(order by step)
from
(
select id, step
     , row_number() over(partition by id, step order by step) rn
from t01
)
group by id, rn
order by id, rn

 


by armadillo [2017.09.12 08:15:20]

감사합니다.

쩝... 답변주신거 보면 왜 이렇게 생각을 못했을까 하는 자괴감이..

다시한번 감사드립니다.


by 마농 [2017.09.12 09:11:34]

5번째 행에 ('03,'3') 자료을 추가했을 경우
 - (1,2)(1,2,3) 이 나와야 할 듯 한데
 - (1,2,3)(1,2) 가 나오는데...
동일 ID 에 대해서 자료의 패턴이 어찌 되는지?
 - 동일한 패턴이 반복되는 형태인지? (1,2,3)(1,2,3)(1,2,3)
 - 특정 패턴이 없이 들쑥날쑥 하는지? (1,2,3)(1,2)(1,2,3,4)
 - 동일한 패턴이 반복되는 형태라면? 굳이 정렬 기준 항목이 필요 없고 jkson 님 방식으로 풀어도 될듯 하고
 - 둘쑥날쑥한 형태라면? 정렬 기준이 반드시 필요한 문제입니다.


by 마농 [2017.09.12 08:37:35]

정렬기준이 명확해야 하는데 정렬기준항목이 표시되어 있지 않네요.
정렬 기준항목이 따로 존재해야만 하고, 이를 기준으로 쿼리를 작성해야만 합니다.
일단 이미 정렬된 상태라고 가정하고 ROWNUM 을 이용해 봤습니다.
 

SELECT id
     , LISTAGG(step, ',') WITHIN GROUP(ORDER BY ROWNUM) step
  FROM t01
 GROUP BY id, ROWNUM - step
 ORDER BY id, MIN(ROWNUM)
;

 


by 김용한 [2017.09.12 08:59:05]

이번것도 http://www.gurubee.net/lecture/2834

이것과 같은맥락인거죠?

listagg처리할 step의 그룹컬럼을 ROWNUM - step 로 구해서 처리한듯...


by armadillo [2017.09.12 19:04:01]

네...말씀하신데로 이미 정렬된 상태입니다만,

질문드릴때 기준을 표시하지 못했습니다.

감사합니다.

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