【问题标题】:Importing Grouped Report Data to Database将分组报表数据导入数据库
【发布时间】:2018-01-24 17:51:54
【问题描述】:

我的公司从无法以任何直接格式提供数据的客户那里收到数据,因此我们必须导入多个采用分组布局的报告,如下图所示。我们必须开发内部方法来取消分组报告,然后导入数据以获取我们需要的所有数据。目前,我团队的一名成员正在使用 MS Access / VBA 生成所需的详细记录,但我想将其移至基于服务器的自动化流程。我们使用 SQL Server 2008R2 进行存储,我想使用 SSIS 来完成任务。有谁知道我可以生成详细记录并将数据直接导入 SQL Server 的方法吗?

【问题讨论】:

  • 我不明白这个问题。您是否在问如何取消 SQL Server 中的数据分组?如何使用 SSIS 将 MS Access 导入 SQL?如何将原始报表导入 SQL Server?请澄清。
  • 我稍微更新了这个问题。我正在寻找一种以编程方式生成详细记录并将它们导入 SQL 服务器的方法。我想完全消除 MS Access 组件。
  • 这很难做到,除非您可以提供分组后的数据样本,然后提供未分组数据的样本。即使那样,除非我们有当前如何取消分组数据的方法,否则可能很难做到,但在我们看到数据之前很难说我们是否需要这种方法。我不确定你附上的图片代表什么。数据是否以 csv 格式或如何提供给您?你能提供这些细节吗?谢谢
  • 数据以 .xlsx 格式提供给我们。对于上图中的文件,我的团队找到活动分组的日期并将其添加到详细信息行,然后删除组页眉和页脚以使其准备好导入。

标签: sql-server database import ssis


【解决方案1】:

嗯-您肯定需要对数据集进行一些程序调整,以将该组日期添加到详细信息行。我不确定您将如何导入 xlsx,但我建议首先使用 SSIS 包,然后在脚本任务中进行调整,这是执行此操作的“最佳”方式。请参阅here,了解如何在 SSIS 脚本任务中处理 Excel。

如果您不了解 SSIS 或特别是编程,那么您最好的选择(在我看来)是将数据导入临时表,使用 T-SQL 进行操作,然后将该表插入你的主桌。我做了这个here的SQL Fiddle。

CREATE TABLE ActivitySummary
(
  id int identity(1,1),
  activity_date date,
  activity varchar(100),
  paid_time decimal(5,2),
  unpaid_time decimal(5,2),
  total_time decimal(5,2)
)

CREATE TABLE ActivitySummary_STG
(
  id int identity(1,1),
  activity_date date,
  activity varchar(100),
  paid_time decimal(5,2),
  unpaid_time decimal(5,2),
  total_time decimal(5,2)
)
GO

-- Simulate import of Excel sheet into staging table
truncate table ActivitySummary_STG;
GO

INSERT INTO ActivitySummary_STG (activity_date, activity, paid_time, unpaid_time, total_time)
select '8/14/17',null,null,null,null 
UNION ALL
select null,'001 Lunch',0,4.4,4.4
UNION ALL
select null,'002 Break',4.2,0,4.2
UNION ALL
select null,'007 System Down',7.45,0,7.45
UNION ALL
select null,'019 End of Work Day',0.02,0,0.02
UNION ALL
select '8/15/17',null,null,null,null 
UNION ALL
select null,'001 Lunch',0,4.45,4.45
UNION ALL
select null,'002 Break',6.53,0,6.53
UNION ALL
select null,'007 System Down',0.51,0,0.51
UNION ALL
select null,'019 End of Work Day',0.02,0,0.02
GO

-- Code to massage data
declare @table_count int = (select COALESCE(count(id),0) from ActivitySummary_STG);
declare @counter int = 1;

declare @activity_date date,
        @current_date date;

WHILE (@table_count > 0 AND @counter <= @table_count)
BEGIN 
  select @activity_date = activity_date
  from ActivitySummary_STG
  where id = @counter;

  if (@activity_date is not null)
    BEGIN
      set @current_date = @activity_date;

      delete from ActivitySummary_STG
      where id = @counter;
    END
  else
    BEGIN
      update ActivitySummary_STG SET
        activity_date = @current_date
      where id = @counter;
    END

  set @counter += 1;
END

INSERT INTO ActivitySummary (activity_date, activity, paid_time, unpaid_time, total_time)
select activity_date, activity, paid_time, unpaid_time, total_time 
from ActivitySummary_STG;

truncate table ActivitySummary_STG;
GO

select * from ActivitySummary;

【讨论】:

    【解决方案2】:

    我会用脚本组件来做。

    总数据流:

    ExcelSource --> 脚本组件(转换)--> 条件拆分 --> SQL 目标

    在脚本组件中:

    在 InputColumns 上查看 accountSummary

    添加 ActivityDate 作为输出列。

    打开脚本:

    在您的行处理之外。

    添加:

    public datetime dte;
    

    行内处理:

    if (DateTime.TryParse(Row.ActivitySummary.ToString()))
    {dte=DateTime.Parse(Row.ActivitySummary.ToString());}
    else
    {Row.ActivityDate = dte;}
    

    然后添加条件拆分以删除空活动日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2015-05-21
      • 2010-11-22
      • 2017-07-10
      相关资源
      最近更新 更多