기존 오라클 쿼리는
SELECT
, LISTAGG(DECODE(SUBSTR(t1.execMm, lv, 1), '1', lv||'월'), '/')
WITHIN GROUP(ORDER BY lv) execMm
, t1.id
FROM (
, A.EXEC_MM AS execMm
, A.id AS id
FROM A_TABLE A
) t1
, (SELECT LEVEL lv FROM DUAL CONNECT BY LEVEL <= 12)
GROUP BY t1.execMm, t1.RD
이렇게 되어있습니다.
하단에 (SELECT LEVEL lv FROM DUAL CONNECT BY LEVEL <= 12)이것과
상단에 LISTAGG를 쓴이유는
execMm라는 컬럼에 예를들어 110000000011라는 값이 있으면 1이 들어가있는 값에 월을 붙이고 구분자로 /를 써서
1월/2월/11월/12월 과 같이 뿌려주면서 12월까지 표현하기위해서 CONNECT BY를 써서 12까지 돌렸고 LASSAGG를 써서 단일행을 합쳤는데요.
MS-SQL에서는 저 두개가 안먹혀서 찾아보니 WITH AS로 CONNECT BY로 대체하고 LISTAGG는 STUFF로 써서 하라는데 제 부족한 실력으로는 잘 안되네요 ㅠ 혹시 죄송하지만 방법이 없을까요?
Comment 2
-
건우아빠
2020.09.14 18:32
-
약은 중
2020.09.15 08:33
원하시는게 제귀호출을 이용한 방법인것 같습니다.이경우 STUFF는 굳이 필요 없어보입니다.;WITH TEST_DATA AS(SELECT 1 EXEC_MM, 100001 ID UNION ALLSELECT 3 , 100001 ID UNION ALLSELECT 10 , 100001 ID UNION ALLSELECT 12 , 100001 ID UNION ALLSELECT 2 , 100002 ID UNION ALLSELECT 4 , 100002 ID UNION ALLSELECT 10 , 100002 ID),CTE_LIST AS(SELECT ROW_NUMBER() OVER(PARTITION BY ID ORDER BY EXEC_MM) RN,CONVERT(VARCHAR,EXEC_MM) execMm,IDFROM TEST_DATA),CTE_DATA AS(SELECT RN,CONVERT(VARCHAR(100),execMm + '월') execMm,IDFROM CTE_LISTWHERE RN = 1UNION ALLSELECT B.RN,CONVERT(VARCHAR(100),A.execMm + '/' + B.execMm +'월') execMm,A.IDFROM CTE_DATA A,CTE_LIST BWHERE A.ID = B.IDAND A.RN + 1 = B.RN)SELECT MAX(execMm) execMm,IDFROM CTE_DATAGROUP BY IDORDER BY ID;
CONNECT BY -> https://devse.tistory.com/60
LISTAGG -> https://kisspa.tistory.com/80
위 질문에서 CONNECT BY 은 단순히 1월 부터 12월을 나타내기 위한 부분으로 보이는데
이경우는 아래와 같이 하셔도 될것 같습니다.
( select number lv from master..spt_values where type = 'P' and number between 1 and 12 )