首页/数据/数仓建模速查/无事实事实表:权重列的使用
维度与事实设计149 条

无事实事实表:权重列的使用

无事实表可带权重列支撑分摊计算:如按面积权重分摊公共费用,权重在事实行为分摊系数而非度量。

数仓建模速查数据更新于 2026-10-13

权重列是什么

无事实事实表是不含度量的事实表,只记录维度组合之间的关系,例如「哪些门店属于哪个分摊组」。当它增加一列权重时,权重扮演的是分摊系数而不是可加总度量:一笔公共费用按各门店面积权重分摊,事实表里存的是比例,金额要由总额乘以权重算出,直接对权重列求和没有业务意义。

基本信息

表内容维度键组合 + 权重列,无金额度量
权重含义分摊比例或系数,不是金额
典型场景公共费用分摊、人力成本分摊、多门店覆盖
校验规则同一分摊组内权重合计应为 1(或 100%)
版本要求权重要有生效版本,历史分摊按当时权重复现
汇总方式先算金额再汇总,不能先汇总权重

典型使用场景

  • 公共费用分摊:总部水电、仓储租金按面积或人头权重分到各门店
  • 人力成本分摊:一个员工服务多个项目时按投入比例分摊工资
  • 收入归属:集团大客户订单按贡献权重分到多个销售团队
  • 覆盖范围记录:明确某个服务点覆盖哪些区域,虽然本身没有度量
  • 预算下拨:按历史权重把总部预算切分到各事业部

按权重分摊与校验

按权重分摊与校验
SELECT a.bill_id, s.store_id, a.total_amt * w.weight / tt.w_sum AS alloc_amt
FROM fact_bill_alloc a
JOIN dim_alloc_weight w ON a.alloc_group = w.alloc_group
JOIN (SELECT alloc_group, sum(weight) AS w_sum   -- 用组内合计做归一,兼容权重不是百分数的情况
      FROM dim_alloc_weight GROUP BY alloc_group) tt
  ON tt.alloc_group = w.alloc_group;
SELECT alloc_group, sum(weight) AS w_sum, count(1) AS member_cnt
FROM dim_alloc_weight GROUP BY alloc_group;   -- 校验:合计应为 1 或 100

权重与度量的区别

对比项权重列度量列
能否直接求和不能,求和无业务含义可以,汇总即合计
单位比例或无量纲系数元、件、人日等
变更影响变更后历史分摊结果会变追加记录,历史不变
校验方法同组合计为 1与外部账目对账
权重变更要有版本:分摊结果一旦出账,历史报表必须能按当时权重复现,否则同一张费用单两次跑批金额不同,财务无法解释。
分摊结果通常需要落到实体表而不是每次查询现算:一是避免每次查询都做归一子查询,二是出账后结果应固化,便于与账单核对。

易错点

  • 权重无版本,历史分摊结果无法复现,财务复核时出现无法解释的差异
  • 权重合计不为 1 或 100 却没做校验,分摊金额与总额对不上
  • 把权重当成度量直接求和,得出「合计权重 3.5」这类无意义结果
  • 分摊组存在成员缺失(新增门店未入组),公共费用分摊后总额变小

数据来源与参考

  • 数据仓库工具箱:无事实事实表
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌