Присоединиться с групповой операцией в SQL - PullRequest
0 голосов
/ 04 октября 2018

Я играю со средой W3Schools SQL.Предварительно заданная база данных - это настройка здесь .

Таблицы, которые будут использоваться: Заказчик и Заказы.

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

SELECT * FROM [Customers]

Чтобы получить клиентов, у которых есть только менее 3 заказов, мы делаем:

SELECT CustomerID, count(*) as num_orders FROM [Orders] group by customerID having num_orders<3

Чтобы получить клиентов у нас в Лондоне, мы делаем:

SELECT * FROM [Customers] where city="London"

Вопрос: Как я могу получить для каждого клиента в Лондоне (с менее чем 3-мя заказами) сколько у них заказов?

Я знаю, что это должно бытьОставьте присоединение, так как я хочу сохранить всех клиентов, даже если у них нет заказов (поэтому в «Заказах» нет записей), но мне трудно заставить его работать.

Я пытался:

SELECT * FROM [Customers] where city="London"
left join (SELECT CustomerID, count(*) as num_orders FROM [Orders] group by customerID having num_orders<3) as data
on customers.CustomerID= data.CustomerID

Но среда не дает значимой информации об ошибке.

1 Ответ

0 голосов
/ 04 октября 2018

Правильный синтаксис:

SELECT c.*, o.num_orders
FROM [Customers] c LEFT JOIN
     (SELECT o.CustomerID, COUNT(*) as num_orders
      FROM [Orders] o
      GROUP BY o.customerID 
     ) o
     ON c.CustomerID = o.CustomerID
WHERE c.city = 'London';

Примечания:

  • Самым важным отличием является порядок предложений.WHERE приходит после предложения FROM.
  • Предложение HAVING удалено, поскольку вопрос для всех клиентов в Лондоне.
  • Одиночные кавычкираньше цитировал Лондон .Одиночные кавычки являются стандартным разделителем строк.
  • В запросе используются псевдонимы таблиц, и они специально выбраны, чтобы быть очень короткими и связанными с именами таблиц.
  • Все столбцы квалифицированы.
...