使用SSIS在事实表中计算每周销售总额

4
我有3个销售数据表,已转换为4个维度表和1个事实表。我已正确填充所有内容,并希望在我的事实表中有“每日销售额”和“每周销售额”。我的原始3个表如下:
- Order(order#(PK),product-id(FK),order-date,total-order,customer#(FK)) - Product(product-id(PK),prod-name,unit-cost,manufacture-name) - Customer(customer#(PK),cust-name,address,telephone#)
数据仓库的星型模式在此处链接:
https://istack.dev59.com/ejR8R.webp 因此,每个表中只有10条记录,并且现在只是测试概念。“每日订单”在事实表中很容易从订单表中的“总订单”翻译过来。我的困难是获得每周总数。我使用了一个派生列和表达式“DATEPART("wk",[order-date])”来创建我的时间维度中的星期列。
所以,我的问题是,从这一点出发,我该如何获得每周销售额?我的第一个想法是在加载事实表的查找序列结束后再使用另一个派生列。我的第二个猜测是……在stackoverflow上寻求帮助。任何帮助将不胜感激,我将提供任何所需的信息!谢谢!
补充说明:我希望按产品级别列出每周销售额,因为我使用DATEPART派生了星期列,所以我不需要过去7天的内容,而是需要每周的总数。我的销售数据仅跨越2个连续的星期,因此我的事实表应该列出1个总数7次和第二个总数3次。我可以从原始订单表中推导出这一点,也可以从我的DW环境中的表中推导出来。最好是后者。有一个限制是我主要受到SSIS及其工具的限制(有“执行SQL语法”工具,因此我仍然可以使用查询)。

问题是什么?在Dim-time中有一个名为week的列,你在写查询时遇到了困难吗?为什么你想要另一列? - fancyPants
@user2253884,您想获取每周销售报告,但是针对哪种组合呢? 是要按客户级别还是产品级别呢? 并且,您想显示下单数量还是本周公司获得的总成本。 - pratik garg
3
每周销售报告将通过连接到日历表并按周属性进行分组来生成。 - Nick.McDermaid
你的每周数据是指过去七天还是截止到本周?一周的最后一天是哪一天?当你聚合这些数据时,你会得到重复计算的数字。通常这是在运行时生成的(或者辅助使用材料化视图)。 - Nick.McDermaid
1个回答

3
在您的Fact-sales数据流中,如果您正在加载每日数据,则填写weekly-order金额将会很具有挑战性。您需要使用Multicast转换,在其中添加一个聚合以对产品、客户、订单和周的值进行求和。这很容易。问题是,您将如何将该数据与数据流中的实际详细级别信息联系起来。这可以通过Merge Join完成,但不推荐。
正如ElectricLlama在评论中指出的那样,您即将做的是混合您的粒度级别。如果周金额未存储在表中,则可以添加所有金额,按您想要的任何维度切片。一旦将该周级别的数据放在同一级别,您的用户将只能汇总每日列。周值可能不是可加的。
我说可能是因为您可以通过累加周值但仅将其存储在任意记录上来模拟它:周的第一天、第三天、最后一天或其他日期。这解决了可加性问题,但现在用户必须记住哪个星期几包含了该周的汇总值。此外,除非他们在您选择解决可加值问题的确切星期几下订单,否则您将为该汇总行生成虚假订单记录。
正确的、未被要求的解决方案是从事实表中删除weekly-order并增强您的数据维度,以允许人们确定每周金额。如果您没有将数据从仓库带到分析引擎中,您可以预先计算每周聚合并将其物化到报告表/视图中。

源数据

让我们看一个简单的场景。客户下了3个订单,其中两个订单是在同一天购买的,购买的是相同的产品(可能一个是加急送货,另一个是标准送货)。
SalesDate |Customer|Product|Order|Amount
2013-01-01|1       |20     |77   |30
2013-01-01|1       |30     |77   |10
2013-01-02|1       |20     |88   |1
2013-01-02|1       |20     |99   |19

事实表

你的用户将使用他们喜欢的工具查看这张表,如果数字不对,你就会接到电话。或者稍后你会收到电话,因为他们重新进货了150个20号产品,而只需要重新订购50个。我不想接任何一个这样的电话。

SalesDate |Customer|Product|Order|daily-order|weekly-order
2013-01-01|1       |20     |77   |30         |50
2013-01-01|1       |30     |77   |10         |10
2013-01-02|1       |20     |88   |1          |50
2013-01-02|1       |20     |99   |19         |50

你说的很有道理,为什么这种方法不可行。不幸的是,我正在大学里完成这个任务,表格必须精确。我已经尝试使用多播方法,但仍然无法运行。我正在从原始订单表中读取数据,在客户、订单、产品和时间维度上进行查找键值。然后我使用多播,将一个输出发送到聚合器,并选择每日订单(SUM)和每周(GROUP BY)。然后我使用来自聚合器和多播的排序,合并连接(左输入),并将其发送到目标事实表。我错过了什么吗? - user2253884
是的,weekly-order可以为空。 - user2253884
教授正在教你如何混合事实表的粒度?!?! - N West
教授有意混合粒度,这有点像曲球式的情况。他觉得这很有趣 :/ 不过,我在这里得到的帮助让我解决了这个问题。 - user2253884

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接