SQL 질문과 답변 게시판
Microsoft SQL Server와 관련된 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
글 수 5,175
안녕하세요? 작업중 고민이 있어 문의드립니다.
데이타는
20100831AA
20100831BB
20100831CC
20100901AA
20100901BB
20100902AA
20100902DD
20100902EE
이런식으로 하나의 컬럼에 들어있구요..
이것을
날짜 테이타
--------------------------------------------------
20100318 AA/BB/CC
20100901 AA/BB
20100902 AA/DD/EE
이런식으로 두개의 컬럼으로 나누어 표시해야합니다.
저장프로시저를 사용하기 어려운 환경이구요..
그냥 인라인쿼리로 해결해야 합니다..
조언좀 부탁드리겠습니다..
2010.08.31 12:47:54 (*.136.117.129)
재귀로 풀었는데... 윗분이 하신 xml이 100만배는 더 머저 보여요 +_+
성능도 훨씬 좋네요. 오늘 새로운걸 하나 배웠습니다. 감사합니다.
아래 쿼리는 그냥 참고만 하세요. 윗분이 만드신 쿼리가 훨씬 좋습니다.
WITH DATA
AS
(
SELECT '20100831AA' AS DATA_STR UNION ALL
SELECT '20100831BB' AS DATA_STR UNION ALL
SELECT '20100831CC' AS DATA_STR UNION ALL
SELECT '20100901AA' AS DATA_STR UNION ALL
SELECT '20100901BB' AS DATA_STR UNION ALL
SELECT '20100902AA' AS DATA_STR UNION ALL
SELECT '20100902DD' AS DATA_STR UNION ALL
SELECT '20100902EE' AS DATA_STR
)
, DATA_RNUM
AS
(
SELECT SUBSTRING(DATA_STR, 0, 9) AS DATA_DATE
, SUBSTRING(DATA_STR, 9, 2) AS DATA_VAL
, ROW_NUMBER() OVER (PARTITION BY SUBSTRING(DATA_STR, 0, 9) ORDER BY SUBSTRING(DATA_STR, 9, 2)) AS RNUM
FROM DATA
)
, DATA_LAYER
AS
(
SELECT DATA_DATE
, CAST(DATA_VAL AS VARCHAR(MAX)) AS DATA_VAL
, RNUM
FROM DATA_RNUM
WHERE RNUM = 1
UNION ALL
SELECT pr.DATA_DATE
, CAST(pr.DATA_VAL + '/' + ch.DATA_VAL AS VARCHAR(MAX)) AS DATA_VAL
, ch.RNUM
FROM DATA_LAYER pr
INNER JOIN DATA_RNUM ch
ON ch.DATA_DATE = pr.DATA_DATE
AND ch.RNUM = pr.RNUM + 1
)
SELECT DATA_DATE, DATA_VAL
FROM (SELECT DATA_DATE, RNUM, DATA_VAL
, MAX(RNUM) OVER (PARTITION BY DATA_DATE) AS MAX_RNUM
FROM DATA_LAYER) RES_SET
WHERE RES_SET.RNUM = RES_SET.MAX_RNUM
ORDER BY DATA_DATE, DATA_VAL;


select '20100831' dt, 'AA' cd union all
select '20100831' dt, 'BB' cd union all
select '20100831' dt, 'CC' cd union all
select '20100901' dt, 'AA' cd union all
select '20100901' dt, 'BB' cd union all
select '20100902' dt, 'AA' cd union all
select '20100902' dt, 'DD' cd union all
select '20100902' dt, 'EE' cd
)
select distinct
dt
, stuff((select '/' + cd as [text()]
from t b
where b.dt = a.dt for xml path('')),1,1,''
) as cd
from t a