2016-12-26 122 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」)。現在,我需要從 「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) 
); 

表城(城)有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

從你的評論看來,你似乎想計算一個平均數而不是一個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 
/
+0

謝謝!但我不明白你爲什麼這麼做:/ count(*)爲「Retraso_Total」。 – Patatas91

+0

其他的事情,如果我執行這個我得到numers像:,705376344 - ,01055565在「Retraso_Total」 – Patatas91

+0

'/計數(*)'是一個編輯錯誤。嘗試沒有它的查詢 – APC