2013-03-10 93 views
0

我正在使用Oracle數據庫。oracle sql count(或其他足夠的聚合)在行不存在時返回零

我有一張桌子:汽車。

它有三個字段

賽 - 汽車 - 完成

車子基本上是ID字段。比賽是比賽的名字。完成是汽車放置的地方:(第1,第2,第4,DNF)。

我想返回某個汽車在每個位置完成多少次,包括零實例。所以,最終的結果將是:

Toyota 
Finish   Amount 
1st   3 
2nd   0 
3rd   2 
DNF   0 

我試過NVL返回零當汽車沒有獲得第二名: 選擇完成,算上從汽車(NVL(完成)) 其中汽車= 「豐田」; 但這仍然只返回第一名和第三名完成計數。

我幾乎是一個SQL初學者,所以我一直在閱讀所有在本網站和其他地方可以找到的零計數問題,並且無法將建議推廣到我的特定情況。

編輯爲包括表: 我包括澄清表。 「競賽」欄目對於這項任務並不重要,因爲我只是在計算「完成」職位。

CAR  RACE  FINISH 
Toyota DCA  1st 
Toyota NYC  3rd 
Toyota ATL  3rd 
Toyota PHI  1st 
+0

工作,我敢肯定這可以用oracle分析函數完成,但不知道細節。 – OldProgrammer 2013-03-10 16:42:49

回答

0
select 
    f.Finish, 
    count(c.Finish) as Finish_Amount 
from 
    (select '1st' as Finish from dual 
    union all 
    select '2nd' from dual 
    union all 
    select '3rd' from dual 
    union all 
    select 'DNF' from dual 
) f 
    left join Cars c 
    on f.Finish = c.finish 
    and c.Car = 'Toyota' 
    --and c.Race = 'Atlanta' 
group by f.Finish 
order by 1 
+0

這仍然只返回第一個和第三個完成計數。它是否失敗,因爲,例如,表中沒有包含三個字段的排:豐田,亞特蘭大,第一。豐田和亞特蘭大都沒有記錄,因爲賽車不存在於比賽中。如果我不清楚,我很抱歉。 – user2154067 2013-03-10 16:27:11

+0

不起作用 - http://sqlfiddle.com/#!4/7c7c9/1 – OldProgrammer 2013-03-10 16:27:49

+0

@ user2154067 - 對不起,修正。 – 2013-03-10 16:48:28

0

這將爲所有的汽車

select a.f,nvl(cnt,0) cnt 
(select '1st' as f from dual 
union 
select '2nd' as f from dual 
union 
select '3rd' as f from dual 
union 
select 'DNF' as f from dual) a, 
(select Finish,count(finish) as cnt from cars group by finish) b 
where a.f=b.finish(+) 

如果你想只有特定的車剛包括where條件給車名一樣

(select Finish,count(finish) as cnt from cars where car='MARUTI' group by finish) 
相關問題