根据转换规则在源和目标之间进行数据检查

时间:2017-06-08 21:46:30

标签: sql sql-server etl

我有两个表,一个是源,另一个是目标。

我需要根据转换逻辑检查数据是否正确转换。

这是源表:EmpIn

empid year  quarter  amount
5     2007    q1       100
5     2007    q2       200
5     2007    q3       300
5     2007    q3       100
5     2007    q4       50
5     2007    q4       100
5     2007    q4       150

转型后的目标表:EmpOut

empid   year   quarter   amount    sequence number
 5      2007     q1       100          0
 5      2007     q2       200          0
 5      2007     q3       300          0
 5      2007     q3       400          1
 5      2007     q4       50           0
 5      2007     q4       150          1
 5      2007     q4       300          2

转换逻辑是:如果相同的季度和同一年有另一个金额条目                           金额将被添加到之前的金额,并且目标中的序列号将增加1.

例如在2007年q3的源表中,我们有两个金额,第一个是300,它将按原样与序列号的目标进行比较 零 下一个条目是前一个金额的加法,即400,序列号加1。 同样的转变也发生在第四季度

我们(I)需要验证数据是否根据此逻辑正确转换到目标表。

2 个答案:

答案 0 :(得分:1)

/*Creating dataset*/
create table #tmp1 (empid int, year int,  quarter  varchar(25), amount int)
Insert into #tmp1 
select 5,2007,'q1',100 union
select 5,2007,'q2',200 union
select 5,2007,'q3',300 union
select 5,2007,'q3',100 union
select 5,2007,'q4',50  union
select 5,2007,'q4',100 union
select 5,2007,'q4',150 


/*Intermediate dataset*/
select 
    ROW_NUMBER() over(partition by empid,quarter order by amount) as ID
    ,* 
Into 
    #tmp2
from 
    #tmp1 order by 2,3,4

/*Desired output dataset*/
select 
     a.empid
    ,a.year
    ,a.quarter
    ,sum(b.amount)
    , a.ID-1 as [sequence number]
from #tmp2 a , #tmp2 b
where 
    a.empid=b.empid 
and 
    a.year=b.year 
and 
    a.quarter=b.quarter 
and 
    a.ID>=b.ID
group by  
    a.ID,
    a.empid,
    a.year,
    a.quarter,
    a.amount
Order By 2,3,4,1

答案 1 :(得分:0)

我想你不能只是验证转换算法吗?

  • 在目标表
  • 中添加字段“original_amount”
  • 循环遍历所有行,序列号为> 0
  • 从当前行的金额中减去前一行(序号no - 1)的金额,并用结果更新新字段
  • 使用序列号= 0
  • 的相同行的数量更新字段
  • 比较两个表的金额和amount_original

喜欢这样。