2010/05/28

[oracle]編 SQLの集計関数で NULLを含む列を集計する場合の注意点

floatingdaysさんのSQLの集計関数で NULLを含む列を集計する場合の注意点

というエントリーで、MySQLとPostgreSQLの検証結果があったので、oracleについて検証してみました。

実行したsql文は↓

SELECT SUM(t.v)   -- => 15
, MIN(t.v) -- => 0
, MAX(t.v) -- => 10
, COUNT(t.v) -- => 3
, AVG(t.v) -- => 5
FROM (
SELECT NULL v from dual
UNION
SELECT 0 v from dual
UNION
SELECT 5 v from dual
UNION
SELECT 10 v from dual
) t

先に結論からいうと、すべて同じになりました。

SUM()やMIN()、MAX()では問題ないが、COUNT()やAVG()ではNULLの行の分も含めて計算したい場合に困る。

via:SQLの集計関数で NULLを含む列を集計する場合の注意点

禿同

よってoracleの場合だとこうなる。

SELECT COUNT(NVL(t.v,0)) -- => 4
, AVG(NVL(t.v,0)) -- => 3.75
FROM (
SELECT NULL v from dual
UNION
SELECT 0 v from dual
UNION
SELECT 5 v from dual
UNION
SELECT 10 v from dual
) t

oracleの場合は、nullの場合は、nvl関数を使って、0とすれば問題は解決します。

是非、ご参考までに。

0 コメント:

コメントを投稿