繁体   English   中英

事实表变更

[英]Fact table changes

语境

我正在尝试创建一个销售情况表。 每行代表客户订单中的产品。 在其他领域中,我有以下3个具体领域:

  • 采购价格
  • selling_price
  • 余量

问题

在我们公司中,当我们销售产品时,我不知道确切的购买价格,因为我稍后会付款,并且购买价格将基于付款日期的汇率。 我通常知道订购日期后1周到2个月之间的实际购买价格。 确实,我的公司已做出安排,使我们能够从收到供应商产品之月起,在下个月的每个15日向供应商付款。 由于我们在不同国家/地区都有供应商,因此汇率带来了一些问题。

等待结果

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

  1. 我在7月3日订购了产品。
  2. 该产品仅在8月7日交付
  3. 然后,我将根据该日期的汇率在9月15日向产品付款。

解决方案

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

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

  2. a)根据订单日期的汇率在事实表中使用purchase_price创建1行。 B)当我付的产品,我知道正确的汇率,因此我可以创建在几乎相同的第一个事实表1个新行,但根据付款日期的汇率这次与purchasing_price。

  3. 一)创建基于订单日期B的汇率purchasing_price事实表中的行),一旦我支付的产品,我知道正确的汇率,因此我可以更新该行并通过基于一个更换purchasing_price正确的汇率。

第四个解决方案属于您。

谢谢您的帮助。 不要犹豫,向我询问更多详细信息。

祝你有美好的一天,

我实际上选择使用货币表并添加一个字段payment_date,该字段使我可以将事实表的每一行与货币表中的正确汇率进行匹配。

但是,我必须更新事实表的每一行以在我知道后添加payment_date。

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

谢谢大家。

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

我建议创建一个新的事实表,说exchange_rates与不同国家的汇率和时间戳。 现在列purchasing_price在事实表,应该是一个结果,从加入exchange_rates表该国。

假设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 |
    +----------+---------+------------------+---------------+--------+

让我知道您是否需要有关其实施的帮助。

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

  • 下令

  • 已交付

  • 购买价格已知

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

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

预定事件

具有属性

 orderId, productId, orderDate  and sellingPrice

交付事件

 orderId, DeliveryDate, 

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

这两个事件都存储在单独的事实表中或一个公共的事实表中,这取决于您所用的完整属性定义。

购买价格存储在具有属性的单独表中

productId, entryDate, validFromDate, ValidToDate, purchasingPrice

该表将根据您在下个月15号(entryDate)的规则以及上个月的有效期进行填充。

该表的关键作用是支持具有productId和validDate的查询,并返回购买价格或未知价格。

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

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

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

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

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

小例子

15.2。 您在一月份获得产品A的购买价格

采购价格表

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

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

 orderDate = 1.3.
 sellingPrice = 200
 ...

您可以使用“最后知道的购买价格”(当前为100)来报告此事件。(具有orderDate的购买价格表中的查找未提供有效结果,将返回最后存储的值)

10.3。交货 传递事件表中创建一条记录

 deliveryDate = 10.3.
 ....

确切的采购价格仍然未知(带有deliveryDate的“采购价格表”中的查询未提供有效结果,将返回最后的储值)

在15.4。 3月的采购价格表中输入了新的采购价格。 从这一点上来说,实际的购买价格是已知的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM