Oracle SQL Average查询

时间:2016-12-26 12:12:22

标签: sql oracle aggregate-functions average mean

我需要用Oracle做一个平均中位数。我有这个:

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")。现在我需要从" Retraso_Total"做一个AVG来获得(" 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(航班)有(id_plane,id_origin_airport,id_destiny_airport,id_company,出发时间,到达时间,出发延迟,到达延迟,日期,取消,乘客,milles:

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(City)有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)
);

1 个答案:

答案 0 :(得分:0)

从您的评论中,您似乎想要计算一个平均值而不是一个MEDIAN,因为您的问题的开头行说。

这很简单。 Oracle AVG()函数为我们计算平均值,而无需派生总计和计数。显然它仍然是凌乱的,因为转换因为表使用字符串来存储数值。

平均值是一个聚合函数,因此我们需要按非聚合列进行分组。在您的示例中,表示目的地机场ID,城市和名称。所以这对你有用:

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 
/