2012-02-13 2 views
0

현재 scd 유형 2 데이터를 차원에로드하는 쿼리의 마지막 부분을 완료하려고합니다. 아래에 제공된 데이터를 기반으로, 만료 된 오래된 레코드 및 추적 기록 등의 차원에 삽입 할 수있는 출력을 생성하고 싶습니다. 데이터는 특성이 변경된 최신 레코드를 보유하고 있습니다. 변경된 값은 조회 열과 함께 및 날짜 변경, 즉 변경이 발생한 날짜에서 찾을 수 있습니다. 이 dateOfchange는 분명히 최신 레코드의 validTo 날짜가되어야합니다. 이 데이터와SCD 유형 2에 대한 T-SQL 구문

CREATE TABLE #tstDimPortfolio 
(
[ID][INT] IDENTITY (1,1) NOT NULL, 
[UPI] [varchar](20) NOT NULL, 
[MF_CODE] [varchar](10) NULL, 
[BH_Code] [varchar](10) NULL, 
[CR_Code] [varchar](10) NULL, 
[ValidFrom][varchar](10) NOT NULL, 
[ValidTo][varchar](10) NULL, 
[IsCurrent] [CHAR] (1) NULL, 
[DateofChange] [varchar](10) NULL, 
[LookupMF_CODE] [varchar](10) NULL, 
[LookupBH_Code] [varchar](10) NULL, 
[LookupCR_Code] [varchar](10) NULL, 
) 

INSERT INTO #tstDimPortfolio 
SELECT 'B06531','B06531','','B06531','20111230',NULL,'Y','20120101','','B06531', '' 
UNION ALL 
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120102','BLI004','', ''UNION ALL 
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120103','BLI005','', ''UNION ALL 
SELECT 'BLI027','BLI027','L147','BBL_GBN','20111230',NULL,'Y','20120104','','L146', '' 

새로운 출력

UPI MF_CODE BH_Code CR_Code ValidFrom ValidTo  IsCurrent 
_______________________________________________________________________ 
B06531 B06531 B06531    20111230 20120101  N 
B06531 B06531 B06531 B06531  20120101 NULL   Y 
BLI003 BLI003 BBL_WORLD   20111230 20120102  N 
BLI003 BLI004 BLI003 BBL_WORLD 20120102 20120103  N 
BLI003 BLI005 BLI003 BBL_WORLD 20120103 NULL   Y 
BLI027 BLI027 L147 BBL_GBN  20111230 20120104  N 
BLI027 BLI027 L146 BBL_GBN  20120104 NULL   Y 

아이디어

+0

@Mitch 밀 FROM #temp INTO . 우리가 ssis를 가지고 있지 않은 순간, 저장 프로 시저를 통해 수행 한 것처럼. 다음과 같이 테이블 자체에 조인 해 보았습니다. –

+0

@Mitch Wheat 우선 t-sql에서 수행해야합니다. 우리가 ssis를 가지고 있지 않은 순간, 저장 프로 시저를 통해 수행 한 것처럼. upi 및 dateOfchange

+0

내가 "당신은 무엇을 시도 했습니까?"라고 말했을 때 나는 이미 당신이 쓴 것을 보여 주었다 ..... –

답변

0

나는 당신의 자연적인 키가 무엇인지에 관해서는 혼란 스러워요해야 다음과 같이

샘플 데이터는 이 테이블에. 그것은 "UPI"인가? 그렇다면 동일한 UPI를 가진 두 개의 레코드 (BLI003)가 있지만 두 레코드가 모두 활성화되어 있으므로 절대 그렇지 않아야합니다.

어쨌든 UPI라고 가정합니다. 우리가 B06531를 업데이트 할 경우, 테이블로 업데이트를 얻을 :

CREATE TABLE #tstDimPortfolioUpdates 
(
[ID][INT] IDENTITY (1,1) NOT NULL, 
[UPI] [varchar](20) NOT NULL, 
[MF_CODE] [varchar](10) NULL, 
[BH_Code] [varchar](10) NULL, 
[CR_Code] [varchar](10) NULL, 
[ValidFrom][varchar](20) NOT NULL, 
[ValidTo][varchar](15) NULL, 
[IsCurrent] [CHAR] (1) NULL, 
[DateofChange] [varchar](10) NULL, 
[LookupMF_CODE] [varchar](10) NULL, 
[LookupBH_Code] [varchar](10) NULL, 
[LookupCR_Code] [varchar](10) NULL, 
) 


INSERT INTO #tstDimPortfolioUpdates 
SELECT 'B06531','B06531','B06531','B06531','20120102',NULL,'Y','20120102','','B06531', '' 

더 이상 ValidTo을 변경하여 활성 없어야합니다 모든 레코드를 설정, 대해 IsCurrent 및 DateOfChange는

UPDATE dp 
SET ValidTo = '20120101', IsCurrent = 'N', DateOfChange = '20120101' 
FROM #tstDimPortfolio dp 
INNER JOIN #tstDimPortfolioUpdates up ON dp.UPI = up.UPI 
AND dp.IsCurrent = 'Y' 

삽입 새 레코드 값

INSERT INTO #tstDimPortfolio (UPI, MF_Code, BH_Code, CR_Code, ValidFrom, ValidTo 
    ,IsCurrent, DateOfChange, LookupMF_Code, LookupBH_Code, LookupCR_Code) 
SELECT UPI, MF_Code, BH_Code, CR_Code, ValidFrom, ValidTo 
    ,IsCurrent, DateOfChange, LookupMF_Code, LookupBH_Code, LookupCR_Code 
FROM #tstDimPortfolioUpdates 

업데이트가 올바른지 다시 확인

SELECT * FROM #tstDimPortfolio 
ORDER BY UPI 
0

재귀 cte를 사용하여 원하는 결과를 얻을 수있었습니다. UPI는 자연의 열쇠입니다. 그러나 실제로 이벤트는 피벗되고 차원에 조인 된 별도의 파일에서옵니다. (BLI003)에는 2 개의 이벤트가 있었으므로 2 개의 행이있었습니다. 는 SQL은 다음과 같이 하였다 :

CREATE TABLE #tstDimPortfolio 
(
[ID][INT] IDENTITY (1,1) NOT NULL, 
[UPI] [varchar](20) NOT NULL, 
[MF_CODE] [varchar](10) NULL, 
[BH_Code] [varchar](10) NULL, 
[CR_Code] [varchar](10) NULL, 
[ValidFrom][varchar](10) NOT NULL, 
[ValidTo][varchar](10) NULL, 
[IsCurrent] [CHAR] (1) NULL, 
[DateofChange] [varchar](10) NULL, 
[LookupMF_CODE] [varchar](10) NULL, 
[LookupBH_Code] [varchar](10) NULL, 
[LookupCR_Code] [varchar](10) NULL, 


) 

INSERT INTO #tstDimPortfolio 
SELECT 'B06531','B06531','','B06531','20111230',NULL,'Y','20120101','','B06531', ''UNION ALL 
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120102','BLI004','', ''UNION ALL 
SELECT 'BLI003','','BLI003','BBL_WORLD','20111230',NULL,'Y','20120103','','BLI005', ''UNION ALL 
SELECT 'BLI027','BLI027','L147','BBL_GBN','20111230',NULL,'Y','20120104','','L146', '' 





SELECT ROW_NUMBER() OVER (PARTITION BY UPI ORDER BY UPI, DateofChange) Sequence, 
    UPI, 
    CASE WHEN LookupMF_CODE <> '' THEN LookupMF_CODE ELSE MF_CODE END MF_CODE, 
    CASE WHEN LookupMF_CODE <> '' THEN LookupBH_Code ELSE BH_Code END BH_Code, 
    CASE WHEN LookupCR_Code <> '' THEN LookupCR_Code ELSE CR_Code END CR_Code, 
    ValidFrom, ValidTo, IsCurrent, DateofChange, 
    LookupMF_CODE, 
    LookupBH_CODE, 
    LookupCR_CODE 
INTO #Dimension_Table 
FROM #tstDimPortfolio 


;WITH AddedDim AS 
(SELECT * FROM 

(
SELECT 
ROW_NUMBER() OVER (PARTITION BY UPI ORDER BY UPI, DateofChange) Sequence, 
UPI, 
CASE WHEN LookupMF_CODE <> '' THEN LookupMF_CODE ELSE MF_CODE END MF_CODE, 
CASE WHEN LookupBH_CODE <> '' THEN LookupBH_Code ELSE BH_Code END BH_Code, 
CASE WHEN LookupCR_Code <> '' THEN LookupCR_Code ELSE CR_Code END CR_Code, 
DateofChange AS ValidFrom, 
ValidTo, 
IsCurrent 
FROM #tstDimPortfolio 
)A 
WHERE SEQUENCE = 1 

UNION ALL 
SELECT 
DT.Sequence 
, DT.UPI 
,CASE WHEN DT.LookupMF_CODE <> '' THEN DT.LookupMF_CODE ELSE DM.MF_CODE END MF_CODE 
,CASE WHEN DT.LookupBH_CODE <> '' THEN DT.LookupBH_Code ELSE DM.BH_Code END BH_Code 
,CASE WHEN DT.LookupCR_Code <> '' THEN DT.LookupCR_Code ELSE DM.CR_Code END CR_Code 
,DT.DateofChange AS ValidFrom 
,DT.ValidTo 
,DT.IsCurrent 
FROM #Dimension_Table dt inner join 
AddedDim dm 
on DT.UPI = DM.UPI 
AND dt.Sequence = DM.Sequence + 1 
) 

SELECT * 제는 T-SQL에서 수행되어야하는 모든 AddedDim