AVG две даты, проблема со значениями NULL - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в написании Oracle SQL, используя Oracle SQL Developer, изменив среду MS SQL Server. Попытка вычислить среднее значение между двумя датами, усеченными, и получаю значения, где одна из дат (appt.CONTACT_DATE) равна NULL. Я бы ожидал там ноль. Смотрите мой код ниже. Что я делаю неправильно? Помощь очень ценится.

TRUNC (
          AVG (
               TO_DATE (appt.CONTACT_DATE, 'DD-MM-YYYY')
             - TO_DATE (REF.ENTRY_DATE, 'DD-MM-YYYY'))
          OVER (PARTITION BY ser2.PROV_NAME),
          1)
          AS "AVG BY PROVIDER"

1 Ответ

0 голосов
/ 30 апреля 2018

Это было бы

TRUNC (AVG (appt.contact_date - REF.entry_date) OVER (PARTITION BY ser2.prov_name), 1)

, потому что:

  • если CONTACT_DATE и ENTRY_DATE относятся к типу данных DATE (и да, так и должно быть), вам не нужно (на самом деле, не нужно) «преобразовывать» дату снова.
    • Если они являются строками (то есть хранятся в столбцах VARCHAR2), тогда да - вы должны преобразовать их в DATE, применяя TO_DATE с соответствующей маской формата
  • Разница между двумя значениями DATE - это количество дней, поэтому нет проблем в AVG, что
  • усечение тоже в порядке

РЕДАКТИРОВАТЬ

Еще немного информации: вот пример, который показывает, что происходит:

SQL> with
  2  appt (contact_date) as
  3    (select trunc(sysdate) from dual union
  4     select null from dual union all
  5     select null from dual),
  6  ref (entry_date) as
  7    (select trunc(sysdate - 5) from dual),
  8  ser2 (prov_name) as
  9    (select 'a' from dual)
 10  select appt.contact_date, ref.entry_date, ser2.prov_name,
 11    TRUNC (AVG (appt.contact_date - REF.entry_date) OVER (PARTITION BY ser2.prov_name), 1) avg_by_provider
 12  from appt, ref, ser2;

CONTACT_ ENTRY_DA P AVG_BY_PROVIDER
-------- -------- - ---------------
30.04.18 25.04.18 a               5
         25.04.18 a               5
         25.04.18 a               5

SQL>

Хотя существует два значения NULL, AVG по-прежнему возвращает результат , который не равен NULL. Как так? Из-за стандарта ANSI SQL, который говорит, что агрегатные функции (такие как AVG) игнорируют значения NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...