COUNT(*)以外の集約は、すべての計算でnullを無視します。
UDT列の値がNULLになるのは、NULLに設定された属性をUDTインスタンスが持っている場合ではなく、列に明示的にNULLを入れた場合だけです。
nullを無視すると、明らかに過渡的ではない異常な結果になることがあります。例えば、列Aまたは列B (あるいはその両方)にNULLがあると、実際に、次の式は、必ず真になります。
SUM(A) + SUM(B) <> SUM(A+B)
ただし、列AとBの両方の値が同じ行にあってNULLである場合は、例外です。その場合には、行の全体が集約において無視されるからです。これは、一般ルールに違反しないようなささいな例です。
より正式にいえば、フィールドAとフィールドBの両方がnullである場合にだけ、いずれかのフィールドにnullが現われるたびに上記の不等条件がfalseになります。
この動作を示す例については、結果のタイプと属性の「例: Nullとして返される社員」および「例: 部署に割り当てられていない社員のカウント」を参照してください。集約は確実に所定どおりに動作していて、結果は算術的に異常にならないことに注意する必要があります。
この明らかに過渡的ではない問題が現われた場合には、解決する手段がいくつかあります。次のいずれかの解決方法では、一定の同じ結果が得られます。
- 必ず、数値列をNOT NULL DEFAULT 0として定義します。
- 集約関数の中でZEROIFNULL関数を使用して、計算のためにNULLをゼロに変換します。例えば、SUM(ZEROIFNULL(x) + ZEROIFNULL(y))は、SUM(ZEROIFNULL(x) + SUM(ZEROIFNULL(y))と同じ結果を出します。