Consulta de Oracle SQL Average

Patatas91

Necesito hacer una mediana promedio con Oracle. Tengo esto:

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;

Calcula el retraso total de varios vuelos ("Retraso_Total"). Ahora necesito hacer un AVG desde "Retraso_Total", para obtener ("Retraso_Total" / número de vuelos) -> Retraso_Medio, algo como esto:

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;

Intento con esto:

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

Pero esta subconsulta no funciona.

¿Cómo puedo hacer eso (todo en la misma consulta)?

¡¡Gracias!!

Tabla Vuelo (Vuelo) tiene (id_plane, id_origin_airport, id_destiny_airport, id_company, hora de salida, hora de llegada, retraso de salida, retraso de llegada, fecha, cancelado, pasajeros, millas:

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)
);

La tabla Ciudad (Ciudad) tiene id_city, nombre, latitud, longitud, población, zona horaria:

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)
);

Table Aeropuerto (Airport) tiene id_airport, name, code, id_city, state, 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)
);
APC

A partir de sus comentarios, parece que desea calcular una MEDIA en lugar de una MEDIANA, como dice la línea de apertura de su pregunta.

Esto es muy sencillo. La AVG()función de Oracle calcula la media para nosotros, sin la necesidad de derivar totales y recuentos. Obviamente, todavía es complicado, debido a la conversión porque la tabla usa cadenas para almacenar valores numéricos.

Un promedio es una función agregada, por lo que debemos agrupar por las columnas no agregadas. En su ejemplo, eso significa el ID, la ciudad y el nombre del aeropuerto de destino. Entonces esto debería funcionar para ti:

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 
/

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

TOP Lista

CalienteEtiquetas

Archivo