如何在SSIS中每天销售每件产品?

时间:2016-12-10 14:49:11

标签: ssis

我的数据非常标准,但是它存在于多个平面文件中,因此我使用SSIS。我有:

  • 日期
  • 产品ID
  • 已售出数字
  • 卖家ID

我有30种产品,所以每天我都要30行,每种产品一个。这样,我可以看到,在日期X,我们已经销售了10个产品A,0个产品B,依此类推。

我不确定应该使用哪种工具。我已经尝试使用Aggregate,但我认为这不是正确的做法。我该怎么办?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;
  

从那里你可以调整@ GordonLinoff的答案来使用日历表或cte ,并在子查询的where子句中确定日期范围。

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;

有关日历表和数字生成的更多信息: