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

此查询仅返回有订单的渠道。如何显示所有频道,即使该特定频道的订单表中没有订单?所以基本上,所有频道都会列出来,如果那个频道没有订单,我需要显示零。

我知道解决这个问题可能很简单。谢谢您的帮助。

4

3 回答 3

0

您的 where 子句将查询限制为对该日期有订单的渠道,但是如果您将该条件移到 join 语句中,它将为您提供所需的结果:

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 只计算具有非空订单的行。在这种情况下,对于没有订单的渠道,您将正确地获得零订单计数。

于 2012-04-12T16:09:18.630 回答
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
于 2012-04-12T16:11:56.713 回答
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
于 2012-04-12T16:14:47.550 回答