Вы почти там ...
Причина, по которой вы не получаете клиентов, которые не делали никаких заказов, состоит в том, что у вас есть условие на OrderDate
.
В то время как left join
означает, что вы должны возвращать клиентов, даже если у них нет заказов, условие на OrderDate означает, что будут возвращены только клиенты с заказами в 2013 году.
Чтобы решить эту проблему, все, что вам нужно сделать, это добавить к этому условию другую опцию - OrderDate
- null. это может быть достигнуто путем простого добавления OR Orders.OrderDate IS NULL
к вашему где п:
SELECT Customer.CustomerID, Count(Orders.OrderID) AS OrderCount
FROM Customer LEFT JOIN Orders ON Customer.[CustomerID] = Orders.[CustomerID]
WHERE YEAR(Orders.OrderDate)=2013
OR Orders.OrderDate IS NULL -- Added this row to your query
GROUP BY Customer.CustomerID
ORDER BY Count(Orders.OrderID) DESC , Customer.CompanyName;
Update
Это было время, так как мои дни доступа, так что я не уверен, что все последующие опции будут работать на доступ.
Все они работают на сервере sql (you can see the fiddle here).
Вариант № 1: Move состояние OrderDate от где caluse к о п:
SELECT Customer.CustomerID, Count(Orders.OrderID) AS OrderCount
FROM Customer LEFT JOIN Orders ON Customer.[CustomerID] = Orders.[CustomerID]
AND YEAR(Orders.OrderDate)=2013
GROUP BY Customer.CustomerID, Customer.CompanyName
ORDER BY OrderCount DESC, CompanyName;
Вариант № 2: Используйте производную таблицу, чтобы получить только заказы от 2013
SELECT Customer.CustomerID, Count(OrderID) AS OrderCount
FROM Customer LEFT JOIN
(
SELECT OrderID, CustomerID
FROM Orders
WHERE YEAR(OrderDate)=2013
) OrdersIn2013
ON Customer.[CustomerID] = OrdersIn2013.[CustomerID]
GROUP BY Customer.CustomerID, Customer.CompanyName
ORDER BY OrderCount DESC, CompanyName;
Вариант № 3: Используйте подзапрос для возврата рассчитывать заказы
SELECT Customer.CustomerID,
(SELECT COUNT(OrderId)
FROM Orders
WHERE Orders.CustomerId = Customer.CustomerId
AND YEAR(OrderDate)=2013
) As OrderCount
FROM Customer
ORDER BY OrderCount DESC, CompanyName;
Вариант № 2 мой личный Favorit, но вариант # 1, вероятно, имеет такую же производительность, с меньшим количеством кода, поэтому некоторые будут утверждать, что это самое лучшее.
Вариант № 3 является наихудшим, так как он использует subQuery.
Покажите запрос, который вы использовали, также хорошо отформатируйте вывод, чтобы избежать путаницы. – Sachu