Написать запрос SQL по базе Northwind (решить задачу)
Какой продавец (EmployeeID) поставил рекорд: обслужил больше всего клиентов (customerID) в течение месяца?
select top(1) max(number) as cust_numb, EmployeeID
from (
select EmployeeID, count(customerID) number, month(OrderDate) AS месяц
from orders
group by EmployeeID, month(OrderDate)
) As tab
group by EmployeeID
order by cust_numb desc
А какими способами еще можно было решить эту задачу?
UPD. Решил. Первое решение было не совсем верным
select top(1) max(number) as cust_numb, EmployeeID, месяц, год
from (
select EmployeeID, count(distinct customerID) number, month(OrderDate) AS месяц, YEAR(OrderDate) AS год
from orders
group by EmployeeID, month(OrderDate), YEAR(OrderDate)
) As tab
group by EmployeeID, месяц, год
order by cust_numb desc
Ответы (2 шт):
Простите, не могу понять, а зачем надо было создавать еще одну таблицу? У меня вот такое решение работает.
SELECT TOP 1 EmployeeID, YEAR(OrderDate) as year, MONTH(OrderDate) as month, count(distinct customerID) as customer_amount, COUNT(*) as amount_orders
FROM Orders
GROUP BY EmployeeID, YEAR(OrderDate), MONTH(OrderDate)
ORDER BY customer_amount DESC
Получаеся как и в Вашем решении продавец ID - 2, год - 1998, месяц - 4, количесто уникальных клиентов - 18, общее количество заказов - 18
С использованием оконных функций:
SELECT TOP 1 EmployeeID, COUNT(DISTINCT customerID) AS cust_numb
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY EmployeeID, MONTH(OrderDate) ORDER BY OrderDate) AS rn
FROM orders
) t
WHERE rn = 1
GROUP BY EmployeeID
ORDER BY cust_numb DESC
С использованием вложенных подзапросов:
SELECT TOP 1 EmployeeID, COUNT(DISTINCT customerID) AS cust_numb
FROM (
SELECT EmployeeID, MONTH(OrderDate) AS month, COUNT(DISTINCT customerID) AS cust_count
FROM orders
GROUP BY EmployeeID, MONTH(OrderDate)
) t
ORDER BY cust_numb DESC
С использованием общей таблицы выражений (CTE):
WITH cte AS (
SELECT EmployeeID, MONTH(OrderDate) AS month, COUNT(DISTINCT customerID) AS cust_count
FROM orders
GROUP BY EmployeeID, MONTH(OrderDate)
)
SELECT TOP 1 EmployeeID, cust_count AS cust_numb
FROM cte
ORDER BY cust_numb DESC
оптимальное решение зависит от специфики задачи и требует экспериментов и оптимизации для достижения наилучших результатов. Самое эффективное решение зависит от многих факторов, включая структуру базы данных, объем данных и характер запросов.