仅合并缺失数据

时间:2013-08-06 18:29:32

标签: sql ssis

我正在开发一个人力资源项目,以Excel文档的形式向我提供数据。

我创建了一个包,用于捕获电子表格中的数据并将其导入SQL。然后,客户想要创建数据连接并将数据放入数据透视表以操作和运行计算。

这揭示了一个小问题,我试图从源代码修复,但看起来无法在系统端解决(使用SAP后端)。

我所拥有的是导入的SQL中缺少成本中心名称或成本中心编号和成本中心名称的信息。

实施例

EmpID    EmployeeName    CostCenterNo    CostCenterName
001      Bob Smith       123456          Sales
010      Adam Eve        543211          Marketing
050      Thomas Adams    121111
121      James Avery     

我与人力资源部门合作,为这些员工获取适当的信息,我已将信息添加到单独的表格中。

我想要做的是找出一种在数据导入Staging表时插入缺失信息的方法。

基本上完成数据。

EmpID    EmployeeName    CostCenterNo    CostCenterName
001      Bob Smith       123456          Sales
010      Adam Eve        543211          Marketing
050      Thomas Adams    121111          Supply Chain
121      James Avery     555316          Human Resources

5 个答案:

答案 0 :(得分:1)

基本更新是否存在问题,例如

Update <tablename> set CostCenterNo = (SELECT CostCenterNo from <hr_sourced_table> where EmpID =x) where EmpID = x 

如果需要,可以添加

Where CostcentreNo is null

因为即使您没有这样做,它也会更新所有应该正确的数据,但出于任何原因,如果您不需要它,您可以像这样更新单个查询中的两个字段

Update <tablename> set CostCenterNo = (SELECT CostCenterNo from <hr_sourced_table> where EmpID =x),CostCenterName = (SELECT CostCenterName from <hr_sourced_table> where EmpID =x) where EmpID = x 

答案 1 :(得分:1)

如果您的数据源表和额外的映射信息都可以从同一个地方访问,则不必使用SSIS更新任何内容。只需构建一个连接两个表的视图,并从视图中填充数据透视表。如果数据源和映射表不一致,您将不得不决定该怎么做,但这是一个业务规则问题。

Select e.EMPLID, e.EmployeeName, cc.CostCenterNo, cc.CostCenterName
From Employees e
  Left Join CCMapping cc on e.emplid=cc.emplid

OR

Select e.EMPLID, e.EmployeeName, 
  coalesce(e.CostCenterNo, cc.CostCenterNo) as CostCenterNo, 
  coalesce(e.CostCenterName, cc.CostCenterName) as CostCenterName
From Employees e
  Left Join CCMapping cc on e.emplid=cc.emplid

答案 2 :(得分:1)

我会在您的数据流中使用lookup transformation来获取您从HR获取的缺失数据。然后将此查找数据连接到来自源(EmpID?)的数据中的相互字段。然后,您可以将缺失数据表中的成本中心号和成本中心名称添加到数据流中。在派生列转换中,您可以测试以查看源中的数据是否为空,如果是,则使用来自缺失数据表的列存储在目标表中。

答案 3 :(得分:1)

在我看来,您可以选择在飞行中完成数据或在数据到达后更新数据。我选择哪条路线取决于复杂程度。

在飞行中

一般来说,这是我的偏好。我希望在数据移动时进行所有擦洗,然后再应用一系列补丁来发光数据。

在您的数据流中,我会有一个条件性拆分,将数据汇集到2到3个流中:所有数据都有成本中心,什么都没有。

&#34;有所有数据&#34;将直接路由到Union All

&#34;有成本中心&#34;将导致查找组件,该组件将使用提供的成本中心查找引用表以获取与现有值关联的文本。查找组件期望找到匹配项,因此如果您的引用表中不存在成本中心的可能性,则需要处理该情况。根据您使用的SSIS版本,将确定您是否可以使用“不匹配的输出”列(2008+)或是否必须使用“错误输出”(2005)。无论哪种方式,您都需要向Lookup指出失败匹配不应导致程序包级别失败。一旦您处理了此查找并处理了不匹配选项,请将该流加入Union All。

&#34;什么都没有&#34;可能表现为&#34;有成本中心&#34;您将在其他列上执行某些查找以确定成本中心的流,或者您可能只是为缺少的实体应用默认/已知未知值。具体工作方式取决于您的企业主提供的规则。

后期处理

这可以使您的数据保持原样。您只需在数据流之后添加一个执行SQL任务来修改任何失去光泽的数据。我是否在执行SQL任务中完全在线执行此操作或创建专用的清理存储过程将基于获取代码所需的部分工作量。一些地方,推动SSIS包改变是一个筹码活动。在其他地方,需要采取SOX饮食的行为来推动一揽子改变,但他们对proc的改变很好。

我的理由是将擦除逻辑推入存储过程。然后,每当他们提出原始查询无法满足的场景时,您的软件包就不必更改。

你在proc中会有2个语句,就像我们在In flight部分中执行的那样。一个查询将更新填充成本中心名称。另一个将应用成本中心和名称。如果您需要有关实际查询细节的帮助,请告诉我,我可以更新此答案。

答案 4 :(得分:0)

我与另一位开发人员合作创建了一个解决方案,这就是我们想出的。 我创建了一个“执行SQL任务”,在其中包含此脚本的数据流之后运行。

MERGE [Staging].[HRIS_EEMaster] AS tgt
    USING (
    SELECT PersNo AS EmpID,
        CostCenterNo AS CCNo,
        CostCenterName AS CCName
    FROM [dbo].[MissingTermedCC]
          ) AS src ON src.EmpID = tgt.PersNo
    WHEN NOT MATCHED BY TARGET
    THEN INSERT (
    PersNo,
    CostCenterNo,
    CostCenterSubDiv
          )
    VALUES (
        src.EmpID,
        src.CCNo,
        src.CCName
          )
    WHEN MATCHED
    THEN UPDATE
          SET tgt.CostCenterNo = CASE
          WHEN src.CCNo > '' THEN src.CCNo
          ELSE tgt.CostCenterNo
        END,
              tgt.CostCenterSubDiv = CASE
          WHEN src.CCName > '' THEN src.CCName
          ELSE tgt.CostCenterSubDiv
        END; 

我想分享以防其他人遇到类似问题。再次感谢所有人的帮助。