2012-04-12 81 views
1
SELECT 
    CH.ChannelName, COUNT(O.OrderID) AS Orders 
FROM 
    Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT JOIN Order O USING (CodeID) 
WHERE 
    O.OrderDate = '2012-04-11' 
GROUP BY 
    CH.ChannelName 
WITH ROLLUP 

此查詢僅返回有訂單的渠道。即使該特定頻道的訂單表中沒有訂單,我如何顯示所有頻道?所以基本上,所有頻道都將被列出,如果該頻道沒有訂單,我需要顯示零。左側加入顯示所有行

我知道這個解決方案可能很簡單。謝謝您的幫助。

回答

0

你的WHERE子句限制查詢到有訂單該日期的渠道,但如果移動的狀態進入連接語句,它會給你的結果你想要的:

SELECT 
    CH.ChannelName, COUNT(O.ID) AS Orders 
FROM 
    Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT JOIN Order O ON CH.CodeID = O.CodeID AND O.OrderDate = '2012-04-11' 
GROUP BY 
    CH.ChannelName 
WITH ROLLUP 

。注意,它應該是COUNT(O.ID)以使SQL只計算具有非空訂單的行。在這種情況下,您將正確地獲得沒有訂單的渠道的零訂單計數。

0
SELECT 
    CH.ChannelName, COUNT(O.OrderID) AS Orders 
FROM 
    Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT OUTER JOIN Order O USING (CodeID) 
WHERE 
    O.OrderDate = '2012-04-11' 
GROUP BY 
    CH.ChannelName 
WITH ROLLUP 
+0

外連接在這種情況下,也無濟於事。它只會爲沒有相應渠道的訂單添加行,但這不是OP想要的。 – 2012-04-12 16:15:04

0

試試這個:

SELECT CH.ChannelName, SUM(O.OrderDate = '2012-04-11') AS Orders 
FROM Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT JOIN Order O USING (CodeID) 
GROUP BY CH.ChannelName 
WITH ROLLUP 
+1

假設您有一個渠道在其他日期只有一個訂單,我們假設在2012-12-12。加入後,該頻道將只有一行,並且將在「OrderDate」列中顯示2012-12-12。然後你的where子句將過濾出這一行,並且結果表根本不包含那個通道。我對嗎? – 2012-04-12 16:18:25

+0

@ KL-7你是對的。我編輯了我的答案。 – 2012-04-12 16:25:23

+0

不錯,應該有效。但是如果你想到性能,我希望將這個條件移入連接語句中,這樣可以讓連接語句更快一些,因爲在連接表之後我們得到了一小排行。 – 2012-04-12 16:29:40