2013-10-23 5 views
1

ETL 질문.날짜 범위 값을 일일 곡물 팩트 테이블로로드

시작 및 종료 날짜가있는 항목이 포함 된 테이블의 경우 시작일의 범위 내에 항목이없는 날을 포함하여 매일 매일의 개수를 검색하는 최적의 방법은 무엇입니까?

주어진 테이블 예

Stock 
ID  StartDate EndDate  Category 
1  1/1/2013 1/5/2013 Appliances 
2  1/1/2013 1/10/2013 Appliances 
3  1/2/2013 1/10/2013 Appliances 

출력 요구

테이블 변수를 만들고, 블록 시작을 반복 동안을 실행하는 것입니다, 영원히 소요 내가 아는
Available 
Category  EventDate  Count 
Appliances 1/1/2013 2 
Appliances 1/2/2013 3 
... 
... 
Appliances 1/10/2013 2 
Appliances 1/11/2013 0 
... 
... 

한 가지 방법, 그리고 검색하고자하는 범위의 끝, 그런 다음 쿼리를 실행하십시오.

Insert into @TempTable (Category,EventDate,Count) 
FROM Stock 
Where @CurrentLoopDate BETWEEN StartDate AND EndDate 

Anot 그녀의 방법은 내가 원하는 채우기 범위에서 날짜의 테이블이나 임시 테이블을 만들고 BETWEEN 함수와 결합하는 것입니다.

Insert into @TempTable (Category,EventDate,Count) 
FROM DateTable 
    INNER JOIN Stock ON DateTable.[Date] BETWEEN StartDate AND EndDate 

그러나 다른 방법은 비슷하지만 SSIS를 사용하지만 본질적으로 위의 두 가지 해결책과 동일합니다.

GURU는 더 효율적인 방법을 알고 있습니까?

답변

1

재귀 CTE를 사용해 보셨습니까? 나는 결국이 문제를 해결하기 위해 무엇을했는지 즉 트릭 ;-)

+0

을해야

WITH Dates_CTE AS ( SELECT [ID] ,[StartDate] ,[EndDate] ,[Category] FROM [dbo].[Stock] UNION ALL SELECT [ID] ,DATEADD(D, 1, [StartDate]) ,[EndDate] ,[Category] FROM Dates_cte d WHERE DATEADD(D, 1, [StartDate]) <= EndDate ) SELECT StartDate AS EventDate ,Category ,COUNT(*) FROM Dates_CTE GROUP BY StartDate, Category OPTION (MAXRECURSION 0) 

. 답변 해 주셔서 감사합니다. – NoMoCouch