PL / SQL: поиск среднего значения для вычитания двух значений - PullRequest
0 голосов
/ 14 октября 2019

По сути, часть моей функции - найти среднее значение локальной переменной с именем Days_Stayed, которая является вычитанием Departure_Date и Arrival_Date. В таблице REGISTRATION хранится только дата прибытия и отъезда лица, а не время, оставшееся самому.

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

 CREATE OR REPLACE FUNCTION
    (p_CustomerCode CHAR)
    RETURN VARCHAR2
    IS 
    v_Output VARCHAR2(100);
    Days_Stayed DATE;
BEGIN
        --SELECT STATEMENT FROM REGISTRATION TABLE--
        IF Registration_Status = 'R' THEN
            Days_Stayed = Departure_Date - Arrival_Date;
            v_Output := (SELECT TO_CHAR(AVG(Days_Stayed), 'Day') 
                         FROM REGISTRATION WHERE Customer_Code = p_CustomerCode), 
                         --other columns

Если кто-нибудь может помочь мне с этой проблемой, это будет очень ценно!

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Звучит так, как должно быть:

v_Output := (SELECT TO_CHAR(AVG(Departure_Date - Arrival_Date), 'Day') 
                         FROM REGISTRATION WHERE Customer_Code = p_CustomerCode)

Просто поместите вычитание в оператор выбора. Это работает?

0 голосов
/ 14 октября 2019

Для меня это звучит как SUM / COUNT, например

SQL> with registration (id, departure_date, arrival_date) as
  2    (select 1, date '2019-09-20', date '2019-09-17' from dual union all -- 3 days
  3     select 1, date '2019-08-13', date '2019-08-11' from dual union all -- 2 days
  4     select 1, date '2019-08-08', date '2019-08-01' from dual union all -- 7 days
  5     --
  6     select 2, date '2019-07-20', date '2019-07-19' from dual union all -- 1 day
  7     --
  8     select 3, date '2019-08-27', date '2019-08-25' from dual union all -- 2 days
  9     select 3, date '2019-08-14', date '2019-08-12' from dual           -- 2 days
 10    )
 11  select id,
 12         sum(departure_date - arrival_date) / count(*) avg_days_stayed
 13  from registration
 14  group by id;

        ID AVG_DAYS_STAYED
---------- ---------------
         1               4
         2               1
         3               2

SQL>

Почему? Ваш код вычитает дату отправления и прибытия (отдельные значения), поэтому - как бы вы выбрали среднее значение из одного значения? Возможно, вы хотели использовать цикл (через каждого человека) или что-то еще, но - приведенный выше запрос может подтолкнуть вас в правильном направлении, то есть без цикла, используйте один запрос.

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