2016-12-10 13 views
0

私のデータはかなり標準ですが、それは複数のフラットファイルになっています。そのため、なぜ私はSSISを使用していますか?私が持っている:SSISで毎日どの製品を販売していますか?

  • プロダクトID
  • ナンバー販売
  • 出品者ID毎日のために、私は30行を持っているしたいと思いますので、

は、私は、1を30個の製品を持っています各製品ごとにそうすれば、私はXという日に、A製品10個、B製品0個を売ったことが分かりました。

どのツールを使用するべきかわかりません。私はAggregateで試したことがありますが、それが正しい方法ではないと思います。私はどのように進めるべきですか?

答えて

1

cross joinを使用して行を生成し、次にleft joinを使用してデータを取り込むことができます。

テーブルにすべての日付とすべての商品が含まれていることを前提としています(必ずしもすべての組み合わせである必要はありません)。基本的な考え方は次のとおりです。

select d.date, p.product, coalesce(t.numsold, 0) 
from (select distinct date from t) d cross join 
    (select distinct product from t) p left join 
    t 
    on t.date = d.date and t.product = p.product; 

ああ、私はあなたのデータは、サプライヤIDを持っていることに気づいたので、与えられた日付の特定の製品のための複数の行は、おそらくあります。したがって、いくつかの集約が必要です。ここでは一つの方法である:

select d.date, p.product, coalesce(sum(t.numsold), 0) 
from (select distinct date from t) d cross join 
    (select distinct product from t) p left join 
    t 
    on t.date = d.date and t.product = p.product 
group by d.date, p.product; 
0

あなたはすべての日付は、製品テーブルになることを保証できない場合は、CTEのカレンダーテーブルを生成する(または好ましくはテーブルにそれを永続化)することができます。

declare @FromDate date; 
declare @ThruDate date; 
set @FromDate = '2010-01-01'; 
set @ThruDate = '2020-12-31'; 
with x as (
    select top (cast(sqrt(datediff(day, @FromDate, @ThruDate)) as int) + 1) 
     [number] 
    from [master]..spt_values v 
) 
/* Date Range CTE */ 
,calendar as (
    select top (1+datediff(day, @FromDate, @ThruDate)) 
     DateValue = convert(date,dateadd(day, 
      row_number() over (order by x.number)-1,@FromDate) 
     ) 
    from x cross join x as y 
     order by DateValue 
) 
    --select DateValue from calendar into dbo.calendar; 

そこからあなたがカレンダーテーブルまたはCTEを使用して、サブクエリのwhere句の日付範囲を決定するGordonLinoffの答え@適応することができます。 - ループ

select [date] = cal.datevalue, p.product, NumSold= coalesce(sum(t.numsold), 0) 
    from (
    select datevalue 
     from calendar 
     where datevalue >= '2016-12-01' 
     and datevalue <= '2016-12-31' 
     ) as cal 
    cross join (
    select distinct product 
     from t 
    ) as p 
    left join t on t.date = cal.datevalue and t.product = p.product 
group by cal.datevalue, p.product; 

詳細

  • David Stein - Creating a Date Table/Dimension on SQL 2008
  • Michael Valentine Jones - F_TABLE_DATE
  • 関連する問題