2012-02-13 54 views
0

我正在尝试完成将scd类型2数据加载到维度的查询的最后部分。 根据下面提供的数据,我想产生一个输出,除了 到期的旧记录和追踪历史记录等之外,还可以插入到一个维度中。数据是这样的,使得我拥有最新的记录,其中的属性发生了变化。查找列和dateOfchange(即更改发生的日期)中找到更改的值。这个dateOfchange显然应该成为最新记录的validTo日期。SCD Type 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

@米奇小麦首先它在T-SQL来完成的。就像我们通过存储过程所做的那样,我们没有ssis。我试图用以下方法将表加入自己: – 2012-02-14 06:28:54

+0

@Mitch小麦首先它必须在t-sql中完成。就像我们通过存储过程所做的那样,我们没有ssis。我已经尝试将upi和dateOfchange 2012-02-14 06:37:58

+0

当我说“你有什么尝试?”我的意思是告诉我们你已经写了什么..... – 2012-02-14 08:16:48

回答

0

我很困惑,你自然键是什么在这张桌子上。它是“UPI”吗?如果是这样,你有两个记录(BLI003)具有相同的UPI,但它们都是主动的,而不应该是这种情况。

无论如何,假设它是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行,因为它有两个事件。在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 * INTO #TEMP FROM AddedDim