2009. 6. 17. 23:13 IT가
row 를 column 으로 붙일경우 유용한 쿼리 한가지.
반응형
저도 이거저거 찾아보다가 안것입니다.
결국에는 Database.sarang.net 에서 찾았습니다.
SELECT card_code, card_name, ltrim(sys_connect_by_path ( noint_mon, ','), ',') noint_mon
FROM (
SELECT card_code, card_name, noint_mon,
row_number() over(PARTITION BY card_code ORDER BY noint_mon) rn, --card_code 기준 row수
COUNT(*) over(PARTITION BY card_code) cnt -- card_code 기준 갯수
FROM (
select card_code,card_name, noint_mon -- 샘플
from dual
)
)
)
WHERE rn = cnt
START WITH rn = 1
CONNECT BY PRIOR rn = rn - 1
AND PRIOR card_code = card_code
connect by 를 사용하여 key 에 맞는 row 수에 맞게 모두 값을 합치는 것입니다.
card_code || card_name || noint_mon
13 || 삼성 || 4
13 || 삼성 || 5
13 || 삼성 || 9
20 || 현대 || 3
20 || 현대 || 6
20 || 현대 || 12
데이터가 이렇다면 위의 쿼리 결과는
card_code || card_name || noint_mon
13 || 삼성 || 4,5,9
20 || 현대 || 3,6,12
이렇게 결과가 나옵니다.
기존에는
max 또는 sum 의 decode 를 이용하여 열을 모두 열거하여 처리하는것이 었죠!!
위의것이 좀더 간편할듯 합니다.
위의 쿼리는 결과key 의 갯수 또는 집합 key의 갯수를 모를때 사용할 수가 있겠죠?
결국에는 Database.sarang.net 에서 찾았습니다.
SELECT card_code, card_name, ltrim(sys_connect_by_path ( noint_mon, ','), ',') noint_mon
FROM (
SELECT card_code, card_name, noint_mon,
row_number() over(PARTITION BY card_code ORDER BY noint_mon) rn, --card_code 기준 row수
COUNT(*) over(PARTITION BY card_code) cnt -- card_code 기준 갯수
FROM (
select card_code,card_name, noint_mon -- 샘플
from dual
)
)
)
WHERE rn = cnt
START WITH rn = 1
CONNECT BY PRIOR rn = rn - 1
AND PRIOR card_code = card_code
connect by 를 사용하여 key 에 맞는 row 수에 맞게 모두 값을 합치는 것입니다.
card_code || card_name || noint_mon
13 || 삼성 || 4
13 || 삼성 || 5
13 || 삼성 || 9
20 || 현대 || 3
20 || 현대 || 6
20 || 현대 || 12
데이터가 이렇다면 위의 쿼리 결과는
card_code || card_name || noint_mon
13 || 삼성 || 4,5,9
20 || 현대 || 3,6,12
이렇게 결과가 나옵니다.
기존에는
max 또는 sum 의 decode 를 이용하여 열을 모두 열거하여 처리하는것이 었죠!!
위의것이 좀더 간편할듯 합니다.
위의 쿼리는 결과key 의 갯수 또는 집합 key의 갯수를 모를때 사용할 수가 있겠죠?
'IT가' 카테고리의 다른 글
log4j, JEUS5 logging 관련 정보. (867) | 2009.06.30 |
---|---|
Oracle RAC Load Balance. (0) | 2009.06.05 |
with clause - 9i 기능. (0) | 2009.05.26 |