2013-02-09 373 views
67

我剛剛得到了一些SQL的困擾。我不認爲我可以出色地提出這個問題 - 所以讓我給你看看。如何在COUNT聚合中包含「零」/「0」結果?

我有兩張桌子,一個叫人,一個叫約會。我正在嘗試返回一個人的約會次數(包括零次數)。約會包含person_id,每個約會有person_id。所以COUNT(person_id)是一個明智的做法。

查詢:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id; 

將正確返回,約會爲person_id擁有的數量。但是,一個沒有任命的人不會被退回(顯然,因爲他們不在該表中)。

調整,以從人表取爲person_id的發言給了我這樣的:

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM appointment 
JOIN person ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 

然而,這仍然會只返回一個爲person_id誰擁有預約,不是我想要的是與人返回誰有0個約會!

有什麼建議嗎?

回答

58

你想爲這個外連接(你需要使用人的「駕駛」表)

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM person 
    LEFT JOIN appointment ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 

之所以這樣,正在工作,對於那些沒有預約的人來說,外(左)連接將返回NULL。聚合函數count()不會計入NULL值,因此您將得到一個零。

如果您想了解更多關於外部連接,這裏是一個很好的教程:http://sqlzoo.net/wiki/Using_Null

17

您必須使用LEFT JOIN代替INNER JOIN

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM person 
LEFT JOIN appointment ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 
+0

由於表未包含在查詢中,GROUP BY看起來像原來問題中的拼寫錯誤。 – 2013-02-10 00:07:41

+0

@JoachimIsaksson我的錯誤。當然 :) – 2013-02-10 00:08:48

4

如果做外連接(與計數),然後用這個結果作爲子表,你可以得到0預期(感謝NVL函數)

例:

select P.person_id, nvl(A.nb_apptmts, 0) from 
(SELECT person.person_id 
FROM person) P 
LEFT JOIN 
(select person_id, count(*) as nb_apptmts 
from appointment 
group by person_id) A 
ON P.person_id = A.person_id 
1

使用連接來獲得使用GROUP BY結果0計數。

只需'連接'就可以在MS SQL內部連接,所以左右連接。

如果在QUERY中首先提到包含主鍵的表,則使用LEFT join else RIGHT join。

EG:

select WARDNO,count(WARDCODE) from MAIPADH 
right join MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE 
group by WARDNO 

select WARDNO,count(WARDCODE) from MSWARDH 
left join MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO 

從具有主鍵和從具有實際條目/細節的另一個表計數的表中分組。