SQL: более эффективный sql запрос к базе данных Chinook - PullRequest
0 голосов
/ 22 февраля 2020

Привет, я тренируюсь с базой данных chinook .

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

enter image description here

Я пробовал с этим кодом в SQLite:

SELECT Full_Name as Best_Salesman, Max(Total_per_Agent) as Maximum_Amount               
FROM                
    (SELECT e.EmployeeId, e.FirstName|| ' '|| e.LastName as Full_Name,sum (i.total) AS Total_per_Agent
    FROM customers c, invoices i, employees e
    WHERE c.CustomerId=i.CustomerId
    AND c.SupportRepId=e.EmployeeId
    AND i.invoiceDate BETWEEN "2009-01-01" AND "2009-12-31"
    GROUP BY c.SupportRepId)

Размер базы данных недостаточно велик, поэтому я действительно мог бы использовать уже созданный код. Но я хотел бы найти более эффективное решение и не использовать код «SELECT / FROM / SELECT». В случае, если база данных будет намного больше, это сделает код более неэффективным.

Любая помощь?

1 Ответ

1 голос
/ 22 февраля 2020

Вам не нужен внешний запрос, так как вы можете использовать внутренний запрос, чтобы получить общую сумму продаж для каждого агента, затем упорядочить набор результатов в порядке убывания и ограничить его одной строкой. Я раньше не использовал SQLite, поэтому извините, если не совсем правильно понял синтаксис, но общая идея такова:

SELECT e.EmployeeId, e.FirstName|| ' '|| e.LastName as Full_Name,sum (i.total) AS Total_per_Agent
FROM customers c, invoices i, employees e
WHERE c.CustomerId=i.CustomerId
AND c.SupportRepId=e.EmployeeId
AND i.invoiceDate BETWEEN "2009-01-01" AND "2009-12-31"
GROUP BY c.SupportRepId 
ORDER BY Total_per_Agent DESC limit 1;

В соответствии с этим потоком, вы можно и нужно упорядочить по псевдониму для агрегированного столбца, а не исходного столбца i.total.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...