我有一个 sql 查询来根据以下情况选择金额总和。
很多地方都有经理负责销售。所有位置的所有经理的销售额都存储在同一个表中。 我想从整个表格中选择经理姓名、地点数量总和及其总金额。
以下是我的 SQL。这是工作。但考虑到表中有 100k 条记录,正在寻找更有效的实现方式。
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;
表数据和预期输出数据
最佳答案
您可以尝试使用 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;
这是对正在发生的事情的解释。窗口函数总是最后求值。唯一在窗口函数之后执行的是 ORDER BY
子句。在上述情况下,GROUP BY
计算后,中间结果中唯一可用的列是 Manager_name
、location_name
和 SUM(销售额)
。当我们将 SUM
用作窗口函数并按经理进行分区时,我们因此可以找到每个经理在所有聚合位置的总和。
关于sql - 需要对总和和总和的有效查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56804379/