算在甲骨文

时间:2012-03-23 17:24:28

标签: sql oracle

我写了以下查询来尝试计算去往特定城市的航班数量,但我不能让它运作

SELECT F.FLI_ID, A.AIRPORT_ID, C.CITY_ID 
FROM FLIGHT F INNER JOIN (AIRPORT A INNER JOIN CITY C ON A.CITY_ID = C.CITY_ID)
ON F.ARRV_AIRPORT = A.AIRPORT_ID
WHERE C.CITY_ID = 1000
GROUP BY F.FLI_ID, A.AIRPORT_ID, C.CITY_ID;

产量

    FLI_ID AIRPORT_ID    CITY_ID
---------- ---------- ----------
        19          1       1000
        11          1       1000

应该收益

NO.FLIGHTS AIRPORT_ID    CITY_ID
---------- ---------- ----------
        2          1       1000

我尝试了以下查询

SELECT COUNT(F.FLI_ID) AS NO_FLIGHTS, A.AIRPORT_ID, C.CITY_ID 
FROM FLIGHT F INNER JOIN (AIRPORT A INNER JOIN CITY C ON A.CITY_ID = C.CITY_ID)
ON F.ARRV_AIRPORT = A.AIRPORT_ID
WHERE C.CITY_ID = 1000
GROUP BY F.FLI_ID, A.AIRPORT_ID, C.CITY_ID;

我得到以下结果

NO_FLIGHTS AIRPORT_ID CITY_ID


     1          1       1000
     1          1       1000

3 个答案:

答案 0 :(得分:3)

你不应该按照你想要计算的相同值进行分组...这就是为什么你最终每行都有一个计数。

更改您的GROUP BY

GROUP BY F.FLI_ID, A.AIRPORT_ID, C.CITY_ID;

要:

GROUP BY A.AIRPORT_ID, C.CITY_ID;

它为您提供以下查询:

SELECT COUNT(F.FLI_ID) AS NO_FLIGHTS, A.AIRPORT_ID, C.CITY_ID 
FROM FLIGHT F INNER JOIN (AIRPORT A INNER JOIN CITY C ON A.CITY_ID = C.CITY_ID)
ON F.ARRV_AIRPORT = A.AIRPORT_ID
WHERE C.CITY_ID = 1000
GROUP BY A.AIRPORT_ID, C.CITY_ID;

答案 1 :(得分:3)

FLI_ID移除GROUP BY。通过将其保留,您迫使计数汇总每FLI_ID个航班的数量,这将始终为1,因此您将获得每个航班ID的一行。

SELECT COUNT(F.FLI_ID) AS NO_FLIGHTS, A.AIRPORT_ID, C.CITY_ID 
FROM FLIGHT F INNER JOIN (AIRPORT A INNER JOIN CITY C ON A.CITY_ID = C.CITY_ID)
ON F.ARRV_AIRPORT = A.AIRPORT_ID
WHERE C.CITY_ID = 1000
GROUP BY A.AIRPORT_ID, C.CITY_ID;

答案 2 :(得分:0)

尝试

SELECT count(1) as NUM_FLIGHTS, A.AIRPORT_ID, C.CITY_ID 
FROM FLIGHT F INNER JOIN (AIRPORT A INNER JOIN CITY C ON A.CITY_ID = C.CITY_ID)
ON F.ARRV_AIRPORT = A.AIRPORT_ID
WHERE C.CITY_ID = 1000
GROUP BY A.AIRPORT_ID, C.CITY_ID;