Подсчет (*) с внутренним объединением и группировка по - PullRequest
1 голос
/ 01 октября 2019

У меня есть 2 таблицы.

Мне нужно получить количество отсчетов с идентификатором из таблицы 2 и получить имя для идентификатора из таблицы 1.

Я попробовал следующий код. Не работал!

select orders.CustomerID, customers.ContactName , count(*) 
from Orders 
  left join customers on Customers.CustomerID= Orders.customerid 
group by Orders.customerid;

Просьба объяснить мои недостатки, если это возможно.

1 Ответ

3 голосов
/ 01 октября 2019

При группировании по разделу запроса необходимо указать все столбцы, которые появляются вне агрегата, например COUNT. Вам не хватает ContactName здесь. Фиксированная версия:

select orders.CustomerID, customers.ContactName , count(*) 
from Orders 
left join customers on Customers.CustomerID= Orders.customerid 
group by Orders.customerid, customers.ContactName;

В качестве альтернативы вы можете сгруппировать только по идентификатору, а затем сделать соединение следующим образом:

With OrderCounts AS
(
select orders.CustomerID , count(*)  AS OrderCount
from Orders 
group by Orders.customerid
)
SELECT OrderCounts.CustomerID
, customers.ContactName
, OrderCounts.OrderCount
FROM OrderCounts
left join customers on Customers.CustomerID= OrderCounts.CustomerID 

Первая версия короче и ее проще вводить. В некоторых сценариях вторая версия будет работать быстрее, так как группировка выполняется в одной таблице и столбце.

Чтобы вторая дала одинаковые результаты, CustomerID должен быть уникальным в таблице клиентов, в противном случае он будет создавать дубликаты (нов этом случае в первом примере количество заказов будет удвоено).

...