权重列是什么
无事实事实表是不含度量的事实表,只记录维度组合之间的关系,例如「哪些门店属于哪个分摊组」。当它增加一列权重时,权重扮演的是分摊系数而不是可加总度量:一笔公共费用按各门店面积权重分摊,事实表里存的是比例,金额要由总额乘以权重算出,直接对权重列求和没有业务意义。
基本信息
| 表内容 | 维度键组合 + 权重列,无金额度量 |
|---|---|
| 权重含义 | 分摊比例或系数,不是金额 |
| 典型场景 | 公共费用分摊、人力成本分摊、多门店覆盖 |
| 校验规则 | 同一分摊组内权重合计应为 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 | 与外部账目对账 |
权重变更要有版本:分摊结果一旦出账,历史报表必须能按当时权重复现,否则同一张费用单两次跑批金额不同,财务无法解释。
分摊结果通常需要落到实体表而不是每次查询现算:一是避免每次查询都做归一子查询,二是出账后结果应固化,便于与账单核对。