2010-10-30 109 views
4

我確定必須有一個簡單的方法來做到這一點,但我已經把我的頭髮拉出了幾個小時,現在我無處可去。這是從客戶公用事業上市工作查詢:相關記錄的條件計數

SELECT c.customer_ID, title, surname, forenames, COUNT(booking_ID) AS bookings 
FROM customer c 
LEFT JOIN booking b 
ON c.customer_ID = b.customer_ID 
WHERE customer_Live 
GROUP BY c.customer_ID, surname, forenames, title 
ORDER BY surname; 

現在的問題是:在COUNT返回所有相關的預約。但是預訂表中有一個'booking_Live'列,當預訂被取消時它被設置爲false。我需要做的是以某種方式排除伯爵取消的預訂;所以如果所有客戶都被取消預訂,它將返回0.我已經嘗試在該組中添加一個HAVING子句,但是這只是最終從輸出中刪除所有沒有實時預訂的客戶。

回答

4

也許我沒有得到它很好,但你爲什麼不使用:

SELECT c.customer_ID, title, surname, forenames, COUNT(booking_ID) AS bookings 
FROM customer c 
LEFT JOIN booking b 
ON (c.customer_ID = b.customer_ID AND b.booking_Live = true) 
WHERE customer_Live 
GROUP BY c.customer_ID, surname, forenames, title 
ORDER BY surname; 
+0

你不能在MS Access中做到這一點。 – Fionnuala 2010-10-30 18:25:14

+0

是的,那個工作很快!我早些時候嘗試過類似的東西,但我無法正確理解語法。謝謝。 – Antagony 2010-10-30 18:27:48

+0

@Remou:我不知道它是訪問版本(2007)還是Jet(4) - 或者它是使用ADO的外部應用程序 - 但它確實有效。 – Antagony 2010-10-30 18:40:02

3

子查詢應解決您的問題。像這樣的東西。

SELECT c.customer_ID, title, surname, forenames, COUNT(booking_ID) AS bookings 
FROM customer c 
LEFT JOIN (SELECT customer_ID, booking_id FROM Booking WHERE booking_live = true) as b 
ON c.customer_ID = b.customer_ID 
WHERE customer_Live 
GROUP BY c.customer_ID, surname, forenames, title 
ORDER BY surname; 
+0

道歉,我無意中發佈到錯誤的答案。雖然我已經檢查過你的,也可以。謝謝。 – Antagony 2010-10-30 18:24:04

+0

這也不包括任何僅取消預訂的客戶。 – 2010-10-31 22:23:05

+0

不,它沒有。這是一個左連接,它將包括所有現場直播的客戶,無論他們的預訂狀態如何。 – KevenDenen 2010-11-01 02:10:03