为什么在Fact表中将NULL值映射为0?

jra*_*ara 5 sql-server null ssis data-warehouse dimensional-modeling

在事实表中的度量字段(维度建模数据仓库)中,NULL值通常映射为0的原因是什么?

Pon*_*ife 15

虽然你已经接受了另一个答案,但我会说使用NULL实际上是一个更好的选择,原因有两个.

第一个原因是,当存在NULL时,聚合返回"正确"答案(即用户倾向于期望的答案)但在使用零时给出"错误"答案.在这两个查询中考虑AVG()的结果:

-- with zero; gives 1.5
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select 0
) dt

-- with null; gives 2
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select null
) dt
Run Code Online (Sandbox Code Playgroud)

如果我们假设此处的度量是"制造物品的天数"而NULL表示仍在生产的物品,则零给出错误的答案.同样的推理也适用于MIN()和MAX().

第二个问题是,如果零是默认值,那么如何区分零作为默认值和零作为实际值?例如,考虑"欧元运费"的衡量标准,其中NULL表示客户自己接收订单,因此没有运费,零表示订单是免费运送给客户的.在不完全更改数据含义的情况下,不能使用零来替换NULL.您可以明显地认为,区别应该从其他维度(例如运输方法)中明确,但这会增加报告的复杂性并理解数据.


Yuc*_*uck 5

这取决于你的建模,但一般来说,这是为了避免执行聚合的复杂性.在许多情况下NULL,0为这些目的进行治疗是有意义的.

例如,NULL订单在给定时间段内的订单.或者是销售NULL收入的销售人员(对他感到羞耻!).

  • 如Pondlife所解释的,这个答案的问题是用零替换NULL会破坏平均值. (2认同)