안녕하세요, 궁금 한 점이 있어 질문을 합니다.
TABLE DATA
DATE NVARCAR(8)
ITEM NVARCAR(10)
VALUE INT
테이블에 아래와 같이 데이터가 있다고 하고
DATE ITEM VALUE
2016.01.01 A 1
2016.01.01 B 2
2016.01.03 A 2
2016.01.06 B 3
2016.01.07 A 4
조회 기간 20160101 ~ 20160107 일때
제가 원하는 결과 값은
DATE ITEM VALUE
2016.01.01 A 1
2016.01.01 B 1
2016.01.02 A 1 -> 상위값 01일자의 값을 표기
2016.01.02 B 2 -> 상위값 01일자의 값을 표기
2016.01.03 A 2
2016.01.03 B 2 -> 상위값 01일자의 값을 표기
2016.01.04 A 2 -> 상위값 03일자의 값을 표기
2016.01.04 B 1 -> 상위값 01일자의 값을 표기
2016.01.05 A 2 -> 상위값 03일자의 값을 표기
2016.01.05 B 1 -> 상위값 01일자의 값을 표기
2016.01.06 A 2 -> 상위값 03일자의 값을 표기
2016.01.06 B 3
2016.01.07 A 4
2016.01.07 B 3 -> 상위값 06일자의 값을 표기
.
.
.
쿼리로 가능 할까요 ?
Comment 1
-
손꽁쥐
2016.09.13 10:04
DECLARE @Start VARCHAR(8) = '20160101';DECLARE @End VARCHAR(8) = '20160107';WITH TEST(DATE,ITEM,VALUE) AS(SELECT '2016.01.01', 'A', 1 UNION ALLSELECT '2016.01.01', 'B', 2 UNION ALLSELECT '2016.01.03', 'A', 2 UNION ALLSELECT '2016.01.06', 'B', 3 UNION ALLSELECT '2016.01.07', 'A', 4), CTE AS(SELECT B.DATE, B.ITEM, A.VALUEFROM TEST ARIGHT JOIN(SELECT CONVERT(VARCHAR, DATEADD(D, NUMBER, @Start), 112) AS 'DATE', 'A' AS 'ITEM'FROM MASTER..SPT_VALUESWHERE TYPE = 'P'AND NUMBER <= DATEDIFF(D, @Start, @End)UNIONSELECT CONVERT(VARCHAR, DATEADD(D, NUMBER, @Start), 112) AS 'DATE', 'B' AS 'ITEM'FROM MASTER..SPT_VALUESWHERE TYPE = 'P'AND NUMBER <= DATEDIFF(D, @Start, @End))B ON REPLACE(A.DATE,'.','') = B.DATE AND A.ITEM = B.ITEM)SELECT A.DATE, A.ITEM, ISNULL(A.VALUE, (SELECT MAX(VALUE) FROM CTE WHERE DATE < A.DATE AND ITEM = A.ITEM AND VALUE IS NOT NULL)) AS 'VALUE'FROM CTE AORDER BY A.DATE더 좋은 쿼리가 있으신분은 알려주세요~