2016-11-04 54 views
0

我試圖爲人們查看可用的&已取消的類的列表,不知何故,我的SQL只打印只保留該類的人,類人們永遠不會保留它從不顯示。當COUNT值等於零時,SQL失敗/不生成

我懷疑它是因爲HAVING只導致生成保留類。

我的表:

CID, ClassLevel, 起始日期, 開始時間, 時間, Descp, 狀態, TID

enter image description here ClassReservation

預留ID, MID, CID, 狀態

enter image description here

時可能會產生只顯示人保留類,但類是創建一個人都沒有儲備將不會出現。

enter image description here

SELECT Classes.CID 
    ,'Date: ' & Classes.StartDate & ', Start Time: ' & Classes.StartTime & ', Duration: ' & Classes.Duration & ', Description: ' & Classes.Descp & ', Status: ' & Classes.STATUS AS CCOM 
FROM Classes 
INNER JOIN ClassesReservation ON Classes.CID = ClassesReservation.CID 
WHERE (
     Classes.STATUS = 'active' 
     OR Classes.STATUS = 'cancelled' 
     ) 
    AND Classes.StartDATE > NOW 
GROUP BY Classes.CID 
    ,Classes.StartDate 
    ,Classes.StartTime 
    ,Classes.Duration 
    ,Classes.Descp 
    ,Classes.STATUS 
HAVING COUNT(ClassesReservation.CID) < 20 
    OR COUNT(ClassesReservation.CID) > 0 
+0

你可以在這裏描述樣本表數據 –

+2

所有數字都滿足這個條件。我想你想的'和' – pinkfloydx33

+1

嘗試使用'留下join' –

回答

0

我會寫這樣的查詢:

SELECT c.CID, 
     ('Date: ' & c.StartDate & ', Start Time: ' & c.StartTime & ', Duration: ' & Classes.Duration & ', Description: ' & c.Descp & ', Status: ' & c.STATUS 
     ) AS CCOM 
FROM Classes as c INNER JOIN 
    (SELECT cr.CID, COUNT(*) as NumReserved 
     FROM ClassesReservation as cr 
     GROUP BY cr.CID 
    ) cr 
    ON c.CID = cr.CID 
WHERE c.STATUS IN ('active', 'cancelled') AND 
     c.StartDATE > NOW 
HAVING cr.NumReserved > 0 AND cr.NumReserved < 20; 

注:

  • 表的別名使查詢更容易編寫和閱讀。
  • IN比一堆=子句更可讀通過OR連接。
  • 移動聚合成一個子查詢,簡化了查詢。
  • 你真正的問題可能僅僅是HAVING子句中的OR
相關問題