我的数据非常标准,但是它存在于多个平面文件中,因此我使用SSIS。我有:
我有30种产品,所以每天我都要30行,每种产品一个。这样,我可以看到,在日期X,我们已经销售了10个产品A,0个产品B,依此类推。
我不确定应该使用哪种工具。我已经尝试使用Aggregate,但我认为这不是正确的做法。我该怎么办?
答案 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;
有关日历表和数字生成的更多信息: