2011-11-28 82 views

回答

4

這取決於您正在建模的內容,但通常是避免執行聚合的複雜性。在許多情況下,爲了這些目的,將NULL視爲0是合理的。

例如,在給定時間段內訂購NULL的客戶。或銷售人員NULL的銷售收入(羞辱他!)。

+0

感謝您的回答。我在考慮用零代替會扭曲一些計算(例如COUNT)? – jrara

+0

'COUNT'處理'NULL'的方式不同,儘管它仍然有意義。您可以顯式計算關係中「NULL」值的數量。你不能真正加起來(即'SUM')值爲'5 + 3 + 20 + NULL + 8'。 – Yuck

+0

@Yuck,Aggregate SUM(measure_here)忽略空條目。 –

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 

如果我們假設該措施在這裏是「天製造項目的數量」和NULL表示仍在生產然後零一個項目給出了錯誤的回答。同樣的推理也適用於MIN()和MAX()。

第二個問題是,如果零是一個默認值,那麼如何區分作爲默認的零和作爲實際值的零?例如,考慮衡量「歐元運費」,其中NULL表示客戶自己拿起訂單,因此沒有運費,零表示訂單已免費送到客戶手中。您不能使用零來替換NULL,而不能完全改變數據的含義。您明顯可以爭辯說,區別應該從其他方面(例如運輸方法)明確,但會增加報告和理解數據的複雜性。

1

主要的原因是,從數據庫中空白對待不同,儘管它們看起來像空白或零到人的眼睛。

這是一個link舊設計提示Ralph Kimball對同一主題。

This blogpost有關避免空值的措施,並提出了一些建議。

0

如果您打算在您的事實欄上做平均值,則應該使用NULL而不是0。這是唯一一次我相信NULLS在dwh事實或尺寸上是可以的

如果事實值是未知/遲到,則以NULL爲最好。

聚合函數suchs爲MIN,上NULLS MAX工作根本無視他們

(根據記錄拉爾夫·金博爾的插袋的人說這在他的過程中我意)在badf

with goodf as 
(
select 1 x 
union all 
select null 
union all 
select 4 
) 
select sum(x) sumx,min(x) minx,max(x) maxx,avg(cast(x as float)) avgx 
from goodf 


with badf as 
(
select 1 x 
union all 
select 0 /* unknown */ 
union all 
select 4 
) 
select sum(x) sumx,min(x) minx,max(x) maxx,avg(cast(x as float)) avgx 
from badf 

高於平均水平出來不正確,因爲它使用未知值的零作爲字面0

相關問題