2016-12-26 5 views
0

Мне нужно сделать среднюю медиану с Oracle. У меня есть это:Oracle SQL Средний запрос

SELECT V.Id_Aeropuerto_Destino AS Id_Aeropuerto, C.Nombre AS Ciudad_Destino, A.nombre AS Aeropuerto, 
(SELECT SUM((TO_NUMBER(V.Retraso_Salida,'99999999D99','nls_numeric_characters=''.,''')) + 
     (TO_NUMBER(V.Retraso_Llegada,'99999999D99','nls_numeric_characters=''.,'''))) 
     FROM Vuelo V 
     WHERE V.Id_Aeropuerto_Destino=Id_Aeropuerto) Retraso_Total 
FROM Ciudad C, Aeropuerto A, Vuelo V 
WHERE V.Id_Aeropuerto_Destino=A.Id_Aeropuerto AND A.Ciudad = C.Id_Ciudad; 

Это вычисляет общую задержку ряда рейсов («Retraso_Total»). Теперь мне нужно сделать AVG от "Retraso_Total", чтобы получить ("Retraso_Total"/количество рейсов) -> Retraso_Medio, что-то вроде этого:

SELECT V.Id_Aeropuerto_Destino AS Id_Aeropuerto, C.Nombre AS Ciudad_Destino, A.nombre AS Aeropuerto, 
(SELECT AVG SUBQUERY) Retraso_Medio, 
(SELECT SUM((TO_NUMBER(V.Retraso_Salida,'99999999D99','nls_numeric_characters=''.,''')) + 
     (TO_NUMBER(V.Retraso_Llegada,'99999999D99','nls_numeric_characters=''.,'''))) 
     FROM Vuelo V 
     WHERE V.Id_Aeropuerto_Destino=Id_Aeropuerto) Retraso_Total 
FROM Ciudad C, Aeropuerto A, Vuelo V 
WHERE V.Id_Aeropuerto_Destino=A.Id_Aeropuerto AND A.Ciudad = C.Id_Ciudad; 

Я пытаюсь с этим:

SELECT AVG(SUM((TO_NUMBER(V.Retraso_Salida,'99999999D99','nls_numeric_characters=''.,''')) + 
     (TO_NUMBER(V.Retraso_Llegada,'99999999D99','nls_numeric_characters=''.,''')))) 
     FROM Vuelo V 
     WHERE V.Id_Aeropuerto_Destino=Id_Aeropuerto 
     GROUP BY V.Id_Aeropuerto_Destino) Retraso_Medio 

Но этот подзапрос не работает.

Как я могу это сделать (все в одном запросе)?

Спасибо!

Таблица Vuelo (Flight) имеет (id_plane, id_origin_airport, id_destiny_airport, id_company, отправление час, прибытие час, задержка вылета, задержки прибытия, дата, отмененный, пассажиры, Миллес:

CREATE TABLE Vuelo(
    Id_Avion number(4), 
    Id_Aeropuerto_Origen number(5), 
    Id_Aeropuerto_Destino number(5), 
    Id_Aerolinea varchar(2), 
    Hora_Salida number(4), 
    Hora_Llegada number(4), 
    Retraso_Salida varchar(5), 
    Retraso_Llegada varchar(5), 
    Fecha varchar(10), 
    Cancelado varchar(3) NOT NULL, 
    Pasajeros varchar(10) NOT NULL, 
    Distancia varchar(10) NOT NULL, 
    CONSTRAINT pk_Vuelo PRIMARY KEY(Id_Avion, Id_Aeropuerto_Origen, Fecha, Hora_salida), 
    CONSTRAINT fk_Avion FOREIGN KEY(Id_Avion) REFERENCES Avion(Id_Avion), 
    CONSTRAINT fk_Aeropuerto_Origen FOREIGN KEY(Id_Aeropuerto_Origen) REFERENCES Aeropuerto(Id_Aeropuerto), 
    CONSTRAINT fk_Aeropuerto_Destino FOREIGN KEY(Id_Aeropuerto_Destino) REFERENCES Aeropuerto(Id_Aeropuerto), 
    CONSTRAINT fk_Aerolinea FOREIGN KEY(Id_Aerolinea) REFERENCES Aerolinea(Id_Aerolinea), 
    CONSTRAINT fk_Fecha FOREIGN KEY(Fecha) REFERENCES Fecha(Id_Fecha) 
); 

Таблица Ciudad (Город) имеет id_city, название, широта, долгота, население, часовой пояс:

CREATE TABLE Ciudad(
    Id_Ciudad number(7), 
    Nombre varchar(80) NOT NULL, 
    Latitud varchar(15) NOT NULL, 
    Longitud varchar(15) NOT NULL, 
    Habitantes number(10) NOT NULL, 
    Timezone varchar(80) NOT NULL, 
    CONSTRAINT pk_Ciudad PRIMARY KEY(Id_Ciudad) 
); 

Таблица Aeropuerto (аэропорт) имеет id_airport, имя, код, id_city, состояние, state_code:

CREATE TABLE Aeropuerto(
    Id_Aeropuerto number(5), 
    Nombre varchar(80) NOT NULL, 
    Codigo varchar(4) NOT NULL, 
    Ciudad number(5) NOT NULL, 
    Estado varchar(80) NOT NULL, 
    Codigo_Estado varchar(4) NOT NULL, 
    CONSTRAINT pk_Aeropuerto PRIMARY KEY(Id_Aeropuerto), 
    CONSTRAINT fk_Ciudad FOREIGN KEY(Ciudad) REFERENCES Ciudad(Id_Ciudad) 
); 
+0

Сумма совокупности без агрегатов .. что вы пытаетесь сделать? Объясните это немного. – GurV

+0

Мне нужно рассчитать общую задержку ряда рейсов («Retraso Total») и среднее значение этого («Retraso Total»/количество рейсов). Извините за мой английский – Patatas91

+0

Пожалуйста, разместите некоторые данные о выборке и ожидаемый результат и правила расчетов – GurV

ответ

0

Из ваших комментариев кажется, что вы хотите рассчитать MEAN, а не MEDIAN, как говорит линия открытия вашего вопроса.

Это довольно просто. Функция Oracle AVG() вычисляет среднее значение для нас, без необходимости выводить итоговые значения и подсчеты. Очевидно, что это все еще грязно, из-за кастинга, потому что таблица использует строки для хранения числовых значений.

Среднее значение является агрегированной функцией, поэтому нам нужно группировать неагрегатные столбцы. В вашем примере это означает идентификатор аэропорта назначения, город и имя. Так что это должно сработать для вас:

SELECT V.Id_Aeropuerto_Destino AS Id_Aeropuerto 
     , C.Nombre AS Ciudad_Destino 
     , A.nombre AS Aeropuerto 
     , AVG((TO_NUMBER(V.Retraso_Salida,'99999999D99','nls_numeric_characters=''.,''')) + 
     (TO_NUMBER(V.Retraso_Llegada,'99999999D99','nls_numeric_characters=''.,'''))) 
     as "Retraso_Total" 
FROM Vuelo V 
    join Aeropuerto A 
     on V.Id_Aeropuerto_Destino=A.Id_Aeropuerto 
    join Ciudad C 
     on A.Ciudad = C.Id_Ciudad 
group by V.Id_Aeropuerto_Destino 
     , C.Nombre 
     , A.nombre 
/
+0

Спасибо!но я не понимаю, почему вы это делаете:/count (*) как «Retraso_Total». – Patatas91

+0

Другое дело, если я выполняю это, я получаю такие числа, как:, 705376344 -, 01055565 в «Retraso_Total» – Patatas91

+0

Ошибка '/ count (*)' была ошибкой редактирования. Попробуйте запрос без него – APC