COUNT с левым присоединением - PullRequest
0 голосов
/ 03 октября 2019
  1. Две таблицы с именами Sales.Customers и Sales.Orders.

  2. Sales.Customers имеет отношение внешнего ключа к столбцу с именем CustomerID в Sales.Orders.

Требование: запрос, который возвращает всеклиентов. Запрос также должен возвращать количество заказов, которые разместил каждый клиент.

Запрос 1:

    SELECT  cust.cutomername,
                NumberofOrders= COUNT(ord.OrderID)
    FROM Sales.Customers Cust
                LEFT JOIN
    Sales.Orders Ord
                ON Cust.CustomerID=Ord.OrderID
    GROUP BY
           Cust.CutomerName;

Но я подумываю и о нижеследующем:

Запрос2:

SELECT  cust.cutomername,
            NumberofOrders= COUNT(Cust.cutomerID)
FROM Sales.Customers Cust
            LEFT JOIN
Sales.Orders Ord
            ON Cust.CustomerID=Ord.OrderID
GROUP BY
       Cust.CutomerName;

Какую из них вы рекомендуете и почему?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Этот запрос:

SELECT c.customername, COUNT(o.OrderID)
FROM Sales.Customers c LEFT JOIN
     Sales.Orders o
     ON c.CustomerID = o.OrderID
GROUP BY c.CustomerName;

Вероятно, возвращает всех клиентов с бессмысленными подсчетами - вероятно, 0, за исключением OrderID с, которые соответствуют CustomerID с.

Вывероятно, намеревается:

SELECT c.customername, COUNT(o.OrderID)
FROM Sales.Customers c LEFT JOIN
     Sales.Orders o
     ON c.CustomerID = o.CustomerId
GROUP BY c.CustomerName;

В этом запросе COUNT() считает количество соответствующих ордеров. Может принимать значение 0 для клиентов без заказов.

Для этого запроса:

SELECT c.customername, COUNT(c.OrderID)
FROM Sales.Customers c LEFT JOIN
     Sales.Orders o
     ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerName;

COUNT() возвращает количество строк ,У каждого клиента есть хотя бы одна строка, поэтому значение никогда не будет 0. Обычно вам нужен предыдущий запрос.

0 голосов
/ 03 октября 2019

Может быть, это ваше решение:

select c.Customername,
    NumberOfOrders = (select count(o.OrderID) from Sales.Orders o where o.CustomerID = c.CustomerID)
from Sales.Customers c
order by c.Customername
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...