1

我正在从事一个 HR 项目,该项目以 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     

我与 HR 合作为这些员工获取适当的信息,我已将这些信息添加到单独的表中。

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

基本上完成了数据。

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
4

5 回答 5

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 
于 2013-08-06T18:38:41.530 回答
1

在我看来,您的选择是完成飞行中的数据或在降落后更新数据。我会选择哪条路线取决于复杂程度。

飞行中

一般来说,这是我的偏好。我宁愿在数据移动时进行所有清理,而不是在之后应用一系列补丁来照亮数据。

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

“拥有所有数据”将直接路由到 Union All

“有成本中心”将导致查找组件,该组件将使用提供的成本中心来查找参考表以获取与现有值关联的文本。查找组件希望找到匹配项,因此如果您的参考表中可能不存在成本中心,您将需要处理这种情况。根据您使用的 SSIS 版本,将决定您是否可以仅使用 Unmatched Output 列 (2008+) 或是否必须征用 Error Output (2005)。无论哪种方式,您都需要向 Lookup 指示匹配失败不应导致包级别失败。处理完此查找并处理不匹配选项后,将该流加入到 Union All。

“什么都没有”可能表现为“有成本中心”流,您将在其中对其他列执行一些查找以确定成本中心,或者您可以简单地为缺失的实体应用默认/已知-未知值。其运作方式将取决于您的企业主提供的规则。

后期处理

这使您的数据流保持原样。您只需在数据流之后添加一个执行 SQL 任务来润色任何受损的数据。无论我是在执行 SQL 任务中完全内联地执行此操作,还是创建一个专用的清理存储过程,都将部分取决于更改代码所需的工作量。在某些地方,推动 SSIS 包更改是一项筹码活动。在其他地方,需要 SOX 的饮食才能推动包更改,但他们对 proc 更改很好。

我的直觉是将洗涤器逻辑推入存储过程。这样您的包就不必在每次遇到原始查询不满足的场景时都进行更改。

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

于 2013-08-06T18:54:42.773 回答
1

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

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

或者

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
于 2013-08-06T18:42:13.970 回答
1

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

于 2013-08-06T18:42:46.370 回答
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; 

我想分享一下,以防其他人遇到类似的问题。再次感谢大家的帮助。

于 2013-08-06T20:50:44.333 回答