2017-08-16 1 views
0

私の会社は、直接フォーマットでデータを提供できないクライアントからデータを受け取り、以下のようなグループ化されたレイアウトのレポートをいくつかインポートする必要があります。レポートをグループ化してからデータをインポートして、必要なすべてのデータを取得するための社内の方法を開発する必要があります。現在私のチームのメンバーは、必要な詳細レコードを生成するためにMS Access/VBAを使用していますが、これをサーバーベースの自動プロセスに移行したいと考えています。私たちはストレージ用にSQL Server 2008 R2を使用しています。私はこの作業を行うためにSSISを使用したいと考えています。詳細レコードを生成してデータをSQL Serverに直接インポートする方法を知っている人はいますか?グループ化されたレポートデータをデータベースにインポートする

enter image description here

+0

日付。 SQL Serverでデータをグループ解除する方法を尋ねていますか? SSISを使用してMS AccessをSQLにインポートする方法は?元のレポートをSQL Serverにインポートする方法どうか明らかにしてください。 –

+0

少し質問を更新しました。私は詳細なレコードをプログラムで生成してSQLサーバーにインポートする方法を探しています。私は、MS Accessコンポーネントを完全に排除したい。 –

+0

グループ化されているデータのサンプルを提供してからグループ化されていないデータのサンプルを提供できない限り、これは困難です。たとえデータが現在どのようにグループ化されていないのかの方法を持っていなければ、それを実行するのは難しいかもしれません。私はあなたが付けたイメージが何を表しているのか分かりません。また、データはcsv形式で、またはどのようにあなたに来ますか?これらの詳細を提供できますか?ありがとう –

答えて

1

うーん - だけでなく、あなたは間違いなく明細行に、そのグループの日付を追加するために、データセットのいくつかのプログラムの調整を行う必要があります。どのようにxlsxをインポートするのか分かりませんが、まずSSISパッケージを使用し、スクリプトタスクでこれを行う「最良の」方法として調整を行うことをお勧めします。 SSISスクリプトタスクでExcelを処理する方法については、hereを参照してください。

もしあなたがSSISを知っていない、あるいは特にプログラミングしているのであれば、私の意見ではステージングテーブルにデータをインポートし、T-SQLで操作してからテーブルを挿入するだけですあなたのメインテーブルに。私はこのhereのSQLフィドルをしました。

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; 
1

私はスクリプトコンポーネントを使用します。スクリプトコンポーネントで> SQL先

ExcelSource - >スクリプトコンポーネント(形質転換により) - - >条件分割:InputColumns

チェックaccountSummary

総データフロー

ActivityDateを出力列として追加します。

オープンスクリプト:

行処理外。

追加:行処理の内部

public datetime dte; 

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

そして、ヌルのアクティビティを削除するには条件分割を追加し、私は質問を理解していない

関連する問題