-- 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, даже если работаем с групповой функцией.
Источник.
Комментариев нет:
Отправить комментарий