SSAS事实建模

SSAS事实建模,ssas,Ssas,背景:零售、交易、促销。好的,让我们看一些数据,你会明白的 收据编号和行编号定义交易中的行项目(收据编号)。您可以看到有两种促销适用于此项目(a、b)。总折扣(-3.54-1.19)等于原值-销售额(12-7.27)。因此,销售(7.27)是所有促销应用后的最终价值 现在我需要在SSAS中构建它作为一个事实。业务密钥将是收据号、行号、促销名。与此相关的维度将是促销。这只是为了说明,真实的事情要复杂得多 所以问题是,如果按促销名称分割事实,没有问题。如果只看到总计而不按促销名称切片,则此商品的销

背景:零售、交易、促销。好的,让我们看一些数据,你会明白的

收据编号和行编号定义交易中的行项目(收据编号)。您可以看到有两种促销适用于此项目(a、b)。总折扣(-3.54-1.19)等于原值-销售额(12-7.27)。因此,销售(7.27)是所有促销应用后的最终价值

现在我需要在SSAS中构建它作为一个事实。业务密钥将是收据号、行号、促销名。与此相关的维度将是促销。这只是为了说明,真实的事情要复杂得多

所以问题是,如果按促销名称分割事实,没有问题。如果只看到总计而不按促销名称切片,则此商品的销售额将翻倍,这是不正确的


那么,在这种情况下,您通常/最佳做法是什么呢?

据我所知,一个干净的模型应该有两个事实表:

  • fact\u sales
    receipt\u no
    line\u no
    组合作为主键,将sales、Units和OriginalValue作为度量值
  • fact\u promotion
    ,其中将
    收据号
    行号
    、促销名作为主键,折扣作为度量

您可能会忽略Sales(销售额)和OriginalValue(原始价值)中的一个,因为它们都可以从另一个和相同的
收据号
行号
的合计折扣中计算出来。但这已经开始讨论优化问题。

如果您在factTable中输入行,则必须输入行的值以及行的值
Sales=OriginalValue(每个促销的)-折扣行
@Justin,问题是我们的系统在应用任何促销之前只有原始值,在应用所有促销之后才有销售。没有中间值。因此,您必须按所需级别对所有数据进行聚合(如果有两个相同的产品,则一张收据中包含促销)。然后将SumValues(OriginalValue)除以行计数。因此,在您的示例中,每行6都会得到
OriginalValue
列,然后
Sales
column
6-3.54=2.46
6-1.19=4.81
Hm,如果只有几次促销,最好将促销从行转移到列。。。在这个例子中,你只得到一行两个折扣:
'disunta'-3.54
'disuntb'-1.19
。如果你能把FactTable的所有样本数据放在一起,也许可以给出更好的解决方案。。。因为我认为应该有销售事实,在销售事实中插入折扣或促销,但可能只是创建折扣行为…@Justin只有一个行项目(第4行),原始值12在所有促销之前。没有办法计算每次促销的金额,因为没有办法知道哪个促销先申请。谢谢。这是我最初的想法。如果用户希望看到一次促销和相关销售,这将起作用。如果用户希望看到所有相关促销的销售情况,该怎么办?这将以我问题中的结果结束。我没有在SSAS中构建它,只是在底层SQLServer数据库中构建了t-SQL。如果我有这两个事实。如何显示正确的结果集?如果用户没有从促销维度中选择任何内容,而是选择了
折扣
度量,那么所有其他有选择的维度都将被考虑在内,这正好可以满足您的需要。@FrankPI是的,如果只使用折扣度量,这是正确的。我的意思是,如果我想在一份报告中看到销售和折扣指标。它将类似于一条销售线和两条促销线(树形结构)。我知道这可能超出范围。@thotwielder如果要查看折扣的不同行,则需要一个分隔这些行的属性。Analysis Services始终将数据聚合到显示属性的级别。要拆分的属性可以是类似于折扣名称的内容,或者如果您也将该属性添加为折扣值。但在任何情况下,对于属性的不同值,只能看到不同的行。