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