2014-12-06 2 views
1

У меня есть эти таблицы:Возвращение данных для самой высокой общей в группе

  • клиентов, который включает в себя: сотрудника идентификатор сотрудника, который помог им
  • заказов, который включает в себя: номер заказа, идентификатор продукта, дата доставки, имя клиента, который заказал этот пункт
  • ORDERDETAILS, который включает в себя порядковый номер, количество, код продукта
  • сотрудника, который включает в себя имя, фамилия

Как я могу показать фамилию и имя сотрудника с наибольшим количеством проданных продуктов?

Я знаю, что мне нужно использовать несколько объединений, псевдонимов и несколько утверждений HAVING, но я не уверен, как действовать дальше.

+1

Можете ли вы подтвердить, что 'product' находится на' orders', а не на 'order details' - viz, в таблице' details', на что ссылается 'количество', если не' sku'/' item'/'код продукта'? – StuartLC

+0

Я подозреваю, что вы создали дубликат аккаунта: http://stackoverflow.com/questions/27327810/sql-inner-join-customers-with-orders –

+0

@StuartLC, отредактировал его, и я надеюсь, что это сделало его более понятным! – youngengineer

ответ

0

Вам не потребуется HAVING. Как вы предположили, присоедините все таблицы к ключам соединения, а затем сгруппируйте оба столбца имени сотрудника.

Ниже запроса (с производной таблицы) должен быть независимым от каких-либо СУБД, но исключает окончательное рассмотрение ограничивая результат в одной строке только, которая зависит от RDBMS

SELECT d.FirstName, d.LastName, d.TotalQuantity 
FROM 
(
    SELECT e.FirstName, e.LastName, SUM(od.Quantity) AS TotalQuantity 
    FROM OrderDetails od 
    INNER JOIN Orders o ON OrderDetails.OrderId = o.OrderId 
    INNER JOIN Customers c ON o.CustomerName = c.CustomerName -- Switch to a surrogate key 
    INNER JOIN Employees e ON c.EmployeeId = e.EmployeeId 
    -- WHERE od.ProductId = `FooBars` -- If you need a filter 
    GROUP BY e.FirstName, e.LastName 
) d 
ORDER BY d.TotalQuantity DESC; 

Для «просто требование сверху работника, вам нужно ограничить количество строк только 1, который RDBMS зависит:

  • Изменить последнюю строку на ORDER BY ... LIMIT 1; для MySql
  • или изменение последней линии ORDER BY ... FETCH FIRST 1 ROWS ONLY; для новых версий SqlServer и Oracle
  • или изменить первую строку в SELECT top 1 d.FirstName, .. для старых версий SqlServer

Примечания:

  • Согласно комментарию, это кажется странным, что идентификатор продукта на таблица ордеров, код sku/item обычно находятся на уровне позиции заказа
  • Моделирование идентификатора обслуживающего служащего непосредственно на столе клиента не является хорошей идеей - как насчет повторных клиентов? Новая таблица соединений ServingEmployeeCustomer звучит по порядку.
  • Соединения по CUSTOMERNAME также не хорошая идея - если нет естественного ключа, желательно создать простой суррогатный ключ (INT идентичности/автоматический номер, или Guid и т.д.)
0

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

SELECT e.FirstName, e.LastName, SUM(od.Quantity) AS Quantity 
FROM OrderDetails od 
INNER JOIN Orders o ON od.OrderId = o.OrderId 
INNER JOIN Customers c ON o.CustomerName = c.CustomerName 
INNER JOIN Employees e ON c.EmployeeId = e.EmployeeId 
GROUP BY e.FirstName, e.LastName 
ORDER BY Quantity DESC; 
Смежные вопросы