【问题标题】:SQL: More efficient sql query against chinook databaseSQL:针对 chinook 数据库更高效的 sql 查询
【发布时间】:2020-02-21 22:13:11
【问题描述】:

我正在练习使用chinook 数据库。

我必须提供一个查询,显示 2009 年哪个销售代理的销售额最高。

我已经在 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”代码。在数据库大得多的情况下,会导致代码效率低下。

有什么帮助吗?

【问题讨论】:

  • 我不知道 sql lite 是否支持 select top(1) {columns} 但这可能更有效。

标签: sql sqlite subquery


【解决方案1】:

您不需要外部查询,因为您可以使用内部查询来获取每个代理的销售总额,然后按降序排列结果集并将其限制为一行。我以前没有使用过 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;

根据this 线程,您可以并且需要按聚合列的别名排序,而不是原始 i.total 列。

【讨论】:

  • 虽然 SELECT/FROM/SELECT 代码保持 7 毫秒,但您建议的新代码在 4 毫秒内完成。感谢兄弟姐妹们的帮助!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多