четверг, 18 марта 2010 г.

Демонстрация обработки значений NULL групповыми функциями

Для демонстрации создадим и заполним небольшую таблицу. Это всегда удобно, потому что после демонстрации можно безболезненно удалить ее и не засорять схему. Этот пример показывает как работает групповая функция AVG со значением NULL:


-- always good to have drop at the top so you can repeat the test from scratch
-- ... and clean up your schema!
drop table avg_test;
create table avg_test (a number);
insert into avg_test values (1);
insert into avg_test values (2);
insert into avg_test values (3);
insert into avg_test values (null);
select sum(a)
      ,avg(a)
      ,avg(nvl(a,0))
      ,sum(a)/count(a) my_avg
      ,sum(a)/count(*) my_Avg2
      ,count(a)
      ,count(*)
      ,count(1)
      ,count(null)
from avg_test;

    SUM(A)     AVG(A) AVG(NVL(A,0))     MY_AVG    MY_AVG2
---------- ---------- ------------- ---------- ----------
         6          2           1.5          2        1.5

  COUNT(A)   COUNT(*)   COUNT(1) COUNT(NULL)
---------- ---------- ---------- -----------
         3          4          4           0
Таким образом, создавая базовую таблицу с одним столбцом я могу вставить 4 строки для разных случаев, которые помогут мне продемонстрировать и подтвердить поведение AVG и SUM/COUNT, а также показать как count(*) зависит от количество особенных строк. Все это описано в документации:
If you specify the asterisk (*), then this function returns all rows, including duplicates and nulls.

Имея это в виду, я могу использовать мои фактические данные чтобы посмотреть, как следующие два запроса могут различаться в поведении только потому, что я использовал разные выражения в COUNT функции:
SELECT  count(*), daily_rate
FROM resources
GROUP by daily_rate
HAVING COUNT(*) > 1;

  COUNT(*) DAILY_RATE
---------- ----------
         2        100
         4
         2        120

SELECT  count(daily_rate), daily_rate
FROM resources
GROUP by daily_rate
HAVING COUNT(daily_rate) > 1;

COUNT(DAILY_RATE) DAILY_RATE
----------------- ----------
                2        100
                2        120


Мы всегда должны обращать внимание на значения NULL, даже если работаем с групповой функцией.

Источник.

Комментариев нет:

Отправить комментарий