2017-10-18 3 views
2

누락 추가 나는 테이블에 결과 쿼리는 아래와 같이있다 :TSQL - 날짜

select * from (select [iKey], [StartDate], [FirstFCDate] from (SELECT [iKey], min([Date]) as [FirstFCDate] from dbo.factFC group by [iKey]) as gp left outer join (select [StartDate], [Key] from dbo.iKeys) dw on gp.iKey = dw.[Key]) ft 

Table1 
iKey StartDate  FirstFCDate 
101  2017-01-13  2017-04-01 
52  2016-11-11  2017-04-01 
21  2017-02-23  2017-04-01 
19  2014-01-21  2017-05-01 
34  2016-08-18  2017-07-01 

내가 뭘하려고 오전 내 팩트 테이블에 (dbo.factProd라는 별도의 테이블) 행을 삽입입니다 그래서 해당 테이블에 시작 날짜와 FirstFCDate 사이의 모든 날짜에 대한 행이 있습니다.

현재, 내 팩트 테이블은 다음과 같다 : 당신이 볼 수 있듯이

factProd 
ID  iKey Date   pAmount fcKey 
1  101  2017-04-01  123  1 
2  101  2017-04-01  456  2 
3  101  2017-04-02  789  1 
4  101  2017-04-02  103  2 
5  101  2017-04-03  192  1 
6  101  2017-04-03  112  2 

이 iKey를 101를 들어, factProd 테이블의 첫 번째 날짜가 올바르게 FirstFCDate 컬럼에 해당 2017년 4월 1일 (이다 표 1에서). 내가 원하는 무엇

각 iKey를 + fcKey 조합에 대한합니다 (STARTDATE 열에서) 2017년 1월 13일 사이의 각 날짜에 대해이 factProd 테이블에 행을 추가합니다.

그래서 최종 결과 (ID가 자동 생성됩니다)과 같아야합니다

factProd 
ID  iKey  Date   pAmount fcKey 
99  101  2017-01-13  0   1 
100 101  2017-01-13  0   2 
101 101  2017-01-14  0   1 
102 101  2017-01-14  0   2 
103 101  2017-01-15  0   1 
104 101  2017-01-15  0   2 
... ...  ...   ...  ... 
199 101  2017-03-31  0   1 
200 101  2017-03-31  0   2 

1  101  2017-04-01  123  1 
2  101  2017-04-01  456  2 
3  101  2017-04-02  789  1 
4  101  2017-04-02  103  2 
5  101  2017-04-03  192  1 
6  101  2017-04-03  112  2 

답변

0

제임스,

당신이 도움이 가능한 모든 날짜에 대해 하나의 행으로 CTE 테이블을 구축 찾을 수 있습니다

범위 사이에 (즉, MIN과 MAX 당신의 팩트 테이블에서 날짜), 다음 LEFT 누락 날짜를 찾기 위해 여기에 가입하세요. 또한 LEFT JOIN을 사용하여 사실 테이블에 삽입하는 것이 좋습니다, NULL 논리, IS 누락 된 일 추가 얻을. 귀하의 시나리오는 좀 더 복잡한 단지보다이지만, 좋은 경로를 당신을 이끌 수 있습니다.

DECLARE @FromDate datetime 
DECLARE @ToDate datetime 
SET @FromDate = '1/1/2017' 
SET @ToDate = '1/1/2018'; 
WITH DayTable AS (SELECT CAST(@FromDate AS DATETIME) AS theDate UNION ALL SELECT DATEADD(dd, 1, theDate) FROM DayTable s WHERE DATEADD(dd, 1, theDate) <= CAST(@ToDate AS DATETIME)) 
SELECT * FROM DayTable 
OPTION 
(MAXRECURSION 32767) 

친절한 관해서 ...

: 여기에 몇 가지 실질적으로 해당 테이블을 구축하는 코드이며,