2016-06-01 58 views
1

我有以下查询SQL填充维差距与日期维度

SELECT INTO #GroupedData 
SUM(Amount) OVER (PARTITION BY Dim1, Dim2 ORDER BY DimDate) AS RunningTotal 
SUM(Amount) AS Total 
Dim1, Dim2, DimDate 
FROM FactTable 
GROUP BY Dim1, Dim2, DimDate 

这给我留下了可能的孔,我有我可以在

加入CalendarTable为了获得将来的日期值输出或填补空白。但是,我怎么做这个考虑维度?

我明白这可能会产生很多行,因为它的DimDate X Dim1 X Dim2取决于您是否可以通过实际的Dim组合限制它。

回答

0

假设您在事实表的某处中有每个日期,那么您可以使用cross join生成行。然后,left join把从事实表中的行:

select d1.dim1, d2.dim2, d.dimdate, sum(f.amount) as total, 
     sum(sum(amount)) over (parition by d1.dim1, d2.dim2 order by d.dimdate) as runningtotal 
from (select distinct dim1 from facttable) d1 cross join 
    (select distinct dim2 from facttable) d2 cross join 
    (select distinct dimdate from facttable) d left join 
    facttable f 
    on f.dim1 = d1.dim1 and f.dim2 = d2.dim2 and f.dimdate = d.dimdate 
group by d1.dim1, d2.dim2, d.dimdate; 

这并假设每个日期表中出现一次。而且,d1和d2`可能已经在表中,因此可以使用这些表代替子查询。

+1

真棒谢谢你,我差一点通过创建所有组合的暗淡和日期表的交叉连接的不同值。但由于演出我没有考虑再次将它们分组。但它的工作原理,其实很快。 – CodeMonkey