我有一个sql查询,以根据以下情况选择金额的总和。
有些经理负责许多地点的销售。所有地点的所有经理的销售金额都存储在同一表中。我想从总表中选择经理名称,地点数量之和及其总金额。
以下是我拥有的SQL。这是工作。但是考虑表中的10万条记录,寻找更有效的实现方式。
SELECT
D1.Manager_name,
D1.location_name,
sum(D1.sale_amount) sale_amount,
(select sum(D2.sale_amount) from details D2 where D1.Manager_name = D2.Manager_name) total_amount
FROM details D1
GROUP BY
D1.Manager_name,
D1.location_name;
Run Code Online (Sandbox Code Playgroud)
表数据和预期输出数据
您可以尝试SUM用作窗口函数来替换相关的子查询:
SELECT
D1.Manager_name,
D1.location_name,
SUM(D1.sale_amount) sale_amount,
SUM(SUM(D1.sale_amount)) OVER (PARTITION BY D1.Manager_name) total_amount
FROM details D1
GROUP BY
D1.Manager_name,
D1.location_name;
Run Code Online (Sandbox Code Playgroud)
这是正在发生的事情的解释。窗口函数总是在最后求值。在窗口函数之后唯一执行的是ORDER BY子句。另外,在上述情况下,在GROUP BY求值,仅在中间结果可用的列是Manager_name,location_name,和SUM(sale_amount)。因此,当我们将其SUM用作窗口功能时,按管理者划分分区,因此,我们可以找到所有汇总位置中每个管理者的总和。