事实 table 变化

Fact table changes

上下文

我正在尝试创建一个销售事实 table。 每行代表客户订单中的一种产品。 在其他字段中,我有这 3 个特定字段:

问题

在我们公司,当我们销售产品时,我不知道确切的进货价格,因为我稍后会支付该产品,进货价格将以付款日期的汇率为准。 我通常在订单日期后的 1 周到 2 个月之间知道实际购买价格。 事实上,我的公司得到了一项安排,允许我们从我们从供应商那里收到产品的那个月起,在下个月的每个月 15 日向供应商付款。 由于我们在不同国家有供应商,因此汇率会引发一些问题。

等待结果

我必须生成 2 份月度报告和 1 份年度报告: - 每月 1 日根据订单日期的汇率生成 1 份报告 - 每个月 15 日的 1 份报告,根据付款日期的汇率(这是当前日期的汇率,因为我们每个月 15 日向供应商付款) - 1 份基于付款日期汇率的年度报告(有时可能是订单日期后 2 个月)

示例

  1. 我在 7 月 3 日订购了一个产品。
  2. 此产品仅在 8 月 7 日发货
  3. 那我9月15号就按当天汇率给货款。

解决方案

到目前为止,我只找到了 3 个解决方案:

  1. a) 在事实 table 和 2 个字段中创建 1 行:real_purchasing_price(等于 0 ) 和 temporary_purchasing_price(根据订单日期的汇率自动等于购买价格)。 b) 一旦我支付了产品,我就知道正确的汇率,因此我可以更新这一行并用基于汇率的购买价格填写字段 real_purchasing_price付款。

  2. a) 根据订单日期的汇率,在 table 中用 purchasing_price 创建 1 行。 b) 一旦我支付了产品,我就知道正确的汇率因此我可以创建一个新行 table 几乎与第一行相似,但这次使用 purchasing_price以付款日汇率为准。

  3. a) 根据订单日期的汇率,在事实table中用purchasing_price创建一行 b) 一旦我支付了产品,我就知道正确的汇率因此我可以更新这一行并用基于正确汇率的那个替换 purchasing_price

第4个答案属于你

感谢您的帮助。 不要犹豫,向我询问更多详情。

祝你有美好的一天,

我假设对于购买价格,您有一个固定的组件和一个可变的组件,这取决于汇率。 (比如 p*x,其中 x 是汇率)

我建议创建一个新事实 table,比如 exchange_rates 具有不同国家/地区的汇率和时间戳。现在,您的事实 table 中的列 purchasing_price 应该是从该国家/地区的 exchange_rates table 加入的结果。

假设 current_values 列保持汇率。

    EXCHANGE_RATES
    +-------------+---------------+---------------+-----------+
    | EXCHANGE_ID | EXCHANGE_NAME | CURRENT_VALUE | TIMESTAMP |
    +-------------+---------------+---------------+-----------+
    |           1 | JAPAN         |           100 |  20151021 |
    +-------------+---------------+---------------+-----------+     

填充购买价格时,使用 EXCHANGE_RATES 中的此值以获得正确的值。

    ORDER_DETAIL_FACT       
    +----------+---------+------------------+---------------+--------+
    | ORDER_ID | PRODUCT | PURCHASING_PRICE | SELLING_PRICE | MARGIN |
    +----------+---------+------------------+---------------+--------+
    |      101 |      11 | 50*100           |          6000 |   1000 |
    +----------+---------+------------------+---------------+--------+

如果您在实施方面需要帮助,请告诉我。

我实际上选择使用货币 table 并添加一个字段 payment_date 允许我将事实 table 的每一行与货币 table 的正确汇率匹配=20=].

尽管如此,我必须更新事实的每一行 table 以在我知道后添加 payment_date。

到目前为止我找不到更好的解决方案。

谢谢大家。

您的订单似乎经历了三个阶段:

  • 已订购

  • 送达

  • 采购价已知

一种数据仓库设计方法是不变性(仅插入,不进行更新)。

这种方法会导致为您的订单创建三个事实记录

有序事件

具有属性

 orderId, productId, orderDate  and sellingPrice

已传送事件

 orderId, DeliveryDate, 

请注意,订单和交货记录与 OrderId 唯一相关(在每个订单只有一个产品的简化假设下)。

这两个事件都存储在单独的事实 table 或共同的事实中 - 这取决于您的情况下的完整属性定义。

购买价格存储在一个单独的table属性

productId, entryDate, validFromDate, ValidToDate, purchasingPrice

table根据您的规则在次月15日(entryDate)填写上月的有效期。

此 table 的关键作用是支持使用 productId 和 validDate 以及 return 采购价格或 unknown.[=20 的查询=]

基于此设计,您可以设置一个 访问视图(简单视图、物化视图或其他解决方案)以提供订单的当前状态

 orderId, productId, orderDate, sellingPrice,
 DeliveryDate, -- NULL if not delivered
 purchasingDate,
 purchasingStaus -- 1 purchased, 0 - not yet purchased
 purchasingPrice

purchasingDate 是根据业务规则根据交货日期计算的。 purchasingStatus 是报告日期和采购日期比较的结果。

purchasingPrice 是产品的估计最后已知价格 或适当的购买价格。

您可能还会问,为什么 不变性 在数据仓库设计中很重要。 它类似于 OLTP 中的事务概念。在遇到麻烦时,您可以使用 auditing dimension 将数据 回滚 到过去的某个时间点,然后重新加载。如果你更新这会复杂得多。

小例子

15.2 日。您获得产品 A 一月份的采购价

购买价格Table

 entryDate = 15.2.
 validFrom = 1.1.
 validTo = 31.1.
 purchacingPrice = 100

产品A在1.3的订单。在 订单事件中创建一条记录 Table

 orderDate = 1.3.
 sellingPrice = 200
 ...

您可以使用 "last know purchacing price" 报告此事件,目前为 100。 (使用 orderDate 在采购价格 Table 中查找没有给出有效结果,最后存储的值为 returned)

10.3 交货。在 交付事件 Table

中创建一条记录
 deliveryDate = 10.3.
 ....

确切的采购价格仍然未知(在 deliveryDate 的采购价格 Table 中查找没有给出有效结果,最后存储的值为 returned)

15.4 日。在 3 月份的采购价格 Table 中输入新的采购价格。 从这一点来看,真正的 购买价格 是已知的。