Городской отчет (Количество заказов) - PullRequest
0 голосов
/ 06 июня 2011

Я создаю отчет по заказам по городам.

SELECT S.city, count(*) as NumOfOrders
    FROM Shop as S
    LEFT JOIN orders O ON O.ShopID = S.ShopID
WHERE O.status = 4
Group by S.city

Результат отобразится примерно так:

Town 1  |   53
Town 2  |   45
Town 3  |   64

Работает нормально, но я хочу отобразить все города, даже нет заказов?

Ожидаемый результат:

Town 1  |   53
Town 2  |   45
Town 3  |   64
Town 4  |   0
Town 5  |   0

Я попытался заменить LEFT JOIN на RIGHT JOIN, это даже не работает. Тот же результат.

Ответы [ 4 ]

6 голосов
/ 06 июня 2011

Ваш фильтр исключает те, у которых нет заказов. Попробуйте ввести условие в соединение, и все будет в порядке.

SELECT S.city, count(O.any_non_nullable_field) as NumOfOrders
    FROM Shop as S
    LEFT JOIN orders O ON (O.ShopID = S.ShopID AND O.status = 4)
Group by S.city
1 голос
/ 06 июня 2011

Несмотря на то, что вы используете LEFT JOIN, вы используете столбец o.statu в предложении Where, и поэтому строки с нулевыми значениями (cos левого соединения) будут удалены.

Попробуйте это:

SELECT S.city, 
        SUM 
        (
        CASE 
            WHEN ISNULL(O.status) THEN 0
            ELSE 1
        END  
        ) as NumOfOrders     
    FROM Shop as S  LEFT JOIN orders O 
      ON O.ShopID = S.ShopID 
 WHERE IFNULL(O.status, 4) = 4 
    GROUP BY S.city 
0 голосов
/ 06 июня 2011

Возможно, это не самый чистый способ, но сработал бы приведенный выше запрос в подзапрос и оставил присоединение к таблице Shop.

SELECT s.city, IfNull(x.NumOfOrders, 0)
FROM Shop as s
LEFT JOIN (
    SELECT S.city, count(*) as NumOfOrders
    FROM Shop as S
    LEFT JOIN orders O ON O.ShopID = S.ShopID
    WHERE O.status = 4
    Group by S.city
) x
ON s.city = x.city
0 голосов
/ 06 июня 2011

Вы правильно выполняете внешнее соединение, но в предложении WHERE имеется условие, что O.status должно быть 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...