2017-05-23 20 views
3

日単位のソースデータがあり、週単位で集計する必要があります。ほとんどのフィールドは簡単な集計です。しかし、私は日曜日の価値を取るために必要なフィールド(「最初の」集計のようなもの)と、土曜日の価値を取るために必要な別のフィールドを持っています。SSIS - ソートされた集計

私がSSISを使用してダウンしているのは、ソースデータをマルチキャストすることです。簡単なフィールドのために定期的な集計を行い、ルックアップを使用して他の2つをそれぞれ土曜日と日曜日に一致させますそれらの値をつかみ、すべてのものを一緒に結合し直してください。

これを行うより良い方法はありますか?

例ソースデータ:

enter image description here

出力はどのようなものか:

enter image description here

答えて

2

これを行うには良い方法はありますを使用して、その使用の集計後

DATEPART("wk", Day) 

最初の週に取得するには?はい。あなたのサーバーの設定に応じて、1と7を微調整する必要があるかもしれませんが、うまくいけば、あなたのアイデアを得る、単純なSQL文で何か

SELECT 
Day, 
SUM(Sales) Sales, 
MAX(
    CASE WHEN DATEPART(dw,Day) = 1 THEN BOP ELSE NULL END 
) As BOP, 
MAX(
    CASE WHEN DATEPART(dw,Day) = 7 THEN EOP ELSE NULL END 
) As EOP 
FROM Table 
GROUP BY Table 

ための複雑なSSISソリューションを使用しないでください。

+0

ありがとうございます。これは単純に多くの意味を持ち、私はそれを考えるのを助けませんでした。私のソースデータがテキストファイルから来ているので、テキストファイルをステージングテーブルにインポートしてから、SQLを使用してすべての変換を実際のテーブルに変換することをお勧めしますか? – ArcherBird

+0

それは私がいつもそれをする方法です。 ETLのインライン化を好む人もいますが、その複雑さが分かります。また、ステージングテーブルを使用すると、インポート部分に集中して、変換部分から分離することができます。 –

2
あなたは以下のように、このためにFIRST_VALUEとLAST_VALUEを使用することができます

select top 1 with ties datepart(week, [day]) as [Week], 
    sum(sales) over(partition by datepart(week, [day])) as Sales, 
    FIRST_VALUE(BOP) over(partition by datepart(week, [day]) order by [day]) as BOP 
    , EOP = LAST_VALUE(EOP) over(partition by datepart(week, [day]) order by [day] RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) 
from #youraggregate 
    Order by Row_number() over(partition by datepart(week, [day]) order by [day]) 
1

派生列を使用UMN変換は、週のコラム

関連する問題