2012-04-12 4 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

Ваших где-пункт ограничивает запрос к каналам, которые имеют заказы на эту дату, но если вы двигаетесь, что условие в присоединиться заявление он даст вам результат вы хотите:

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. –

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 будет отфильтровывать эту строку, и итоговая таблица не будет содержать этот канал вообще. Я прав? –

+0

@ KL-7 Вы абсолютно правы. Я отредактировал свой ответ. –

+0

Ницца, это должно сработать. Но если вы думаете о производительности, я ожидаю, что перенос этого условия в оператор соединения сделает его немного быстрее, поскольку мы получим меньший набор строк после присоединения к таблицам. –

Смежные вопросы