单价和折扣 - 事实或维度表

Posted

技术标签:

【中文标题】单价和折扣 - 事实或维度表【英文标题】:Unit Price and Discounts - Fact or Dimension Table 【发布时间】:2019-11-19 20:36:36 【问题描述】:

我正在为我们的销售和营销部门开发一个数据集市,我遇到了建模挑战。我们的 ERP 以几种不同的方式存储定价数据:

    列出每件商品的定价 产品线的定价折扣百分比,适用于客户组或特定客户 商品的自定义价格,适用于客户组或特定帐户

定价部门主要将这些数据用于运营而非分析。例如,他们为客户生成报告(“我有哪些特价/折扣%s?”),并确定在他们采用新的定价策略时需要更改哪些商品/商品组。

定价变化会在一定程度上定期发生,规模很小,通常是逐个客户或逐个项目。除了客户级别的折扣外,很少有对清单定价和团体定价(折扣和单个项目)进行大规模调整。

我一直在创建一个或多个事实表来表示这个过程。不幸的是,没有预先存在的定价业务密钥。也没有具体的“交易日期”,因为 ERP 没有(准确地)维护定价何时更改的记录。从本质上讲,“定价事件”将是以下各项的组合:

    生效日期 结束日期 项目或产品线 (标价不需要)客户或客户群 价格金额或折扣百分比

单个事实表似乎有问题,因为我将不得不处理大量无效的维度和事实组合。首先,一条记录永远不会同时具有非 NULL 价格金额和非 NULL 折扣百分比;定价事件是非此即彼。其次,只有特定的维度组合对每个事实有效。例如,折扣百分比只会有一个产品线,而不是单个项目。

首先将定价建模为事实表是否有意义?如果是这样,我应该考虑多少张桌子?我的直觉是至少使用两个,一个用于百分比,一个用于价格金额,但这仍然会留下一个问题,即每条记录要么有一个有效的客户组要么有一个有效的客户(或者都没有,对于标价),因为我们需要将客户特定的定价与客户可能拥有的任何团体定价分开。

【问题讨论】:

【参考方案1】:

您可能需要将它们作为属性和事实来保存。

    某件商品的售价是事实。当您将其乘以销售量时,它实际上是一种附加量度。所以,把它放在事实表中。应用的总折扣也是累加的,我会保留它。您稍后可以查询“2019 年每位客户打折了多少”,如果没有这些事实,这将更难实现。

    但是如果你还需要查询诸如“客户X的折扣是多少”之类的东西,那么你也应该把它作为客户维度的一个属性,并将它作为一个II类维度来对待,这样保留折扣历史。如果您知道何时应用了某个折扣,那就太好了,如果不将第一次销售作为开始日期,那么您不会太远。

    也许标价也可以作为产品或产品线的属性保留在一个维度中,但前提是它们不经常变化;但是,如果大多数客户无论如何都获得折扣,那将是有限的。

【讨论】:

扩展价格实际上保存在订单和发票事实表中,因此我们可以计算平均售价等内容。在 Customer 表中保留价格的问题在于价格是维度属性的组合:特定项目的客户价格、特定产品线的客户折扣等。这同样适用于 Item 表,除了标价,因为您需要按客户或按客户组定价。 如果折扣和价格是特定于客户和产品的,那么它们应该保存在事实表中。仅当其值仅取决于客户而不取决于其他因素时,才应将其保留在客户表中。另一种选择是包含客户/产品及其各自价格、生效日期、折扣等组合的无事实事实表。不过,分析可能会变得复杂。

以上是关于单价和折扣 - 事实或维度表的主要内容,如果未能解决你的问题,请参考以下文章

维度建模中事实表的两个或多个相似计数

事实表,维度,度量,指标之间的关系

维度表和事实表的含义是啥?

我需要定义事实表或维度表吗?

数据仓库 - 多维模型 - 事实表小于维度表

数据仓库 - 如何使用 R 和/或 SQL 创建一个与所有维度相交的事实表