我有一张table叫 transactions
它包含了卖家和他们的交易:销售,浪费,以及他们何时收到产品。基本结构如下:
seller_id transaction_date quantity reason product unit_price
--------- ---------------- -------- ------ ------- ----------
1 2018-01-01 10 import 1 100.0
1 2018-01-01 -5 sale 1 100.0
1 2018-01-01 -1 waste 1 100.0
2 2018-01-01 -3 sale 4 95.5
我需要每个卖家的每日总结,包括他们的销售价值,浪费和开始库存。问题是,起始库存是截至给定日期的累计数量总和(也包括给定日期的进口量)。我有以下疑问:
SELECT
t.seller_id,
t.transaction_date,
t.SUM(quantity * unit_price) as amount,
t.reason as reason,
(
SELECT SUM(unit_price * quantity) FROM transactions
WHERE seller_id = t.seller_id
AND (transaction_date <= t.transaction_date)
AND (
transaction_date < t.transaction_date
OR reason = 'import'
)
) as opening_balance
FROM transactions t
GROUP BY
t.transaction_date,
t.seller_id
t.reason
查询工作正常,我得到了所需的结果。但是,即使在为外部查询和子查询创建索引之后,也需要花费太多的时间(大约30秒),因为 opening_balance
查询是一个从属子查询,它为每一行反复计算。
如何优化或重写此查询?
编辑:子查询有一个小错误,缺少where条件,我修复了它,但问题的本质是一样的。我创建了一个摆弄示例数据的工具:
https://www.db-fiddle.com/f/ma7mhufsehxexlfxhctgbz/2
3条答案
按热度按时间xxe27gdn1#
下面使用用户定义变量的方法比使用相关子查询的方法性能更好。对你来说
temp
变量被用来解释计算逻辑,它也被输出。你可以忽略这一点。您可以尝试以下查询(如果需要,可以添加更多解释):
查询
结果(请注意,我已订购
seller_id
先是然后transaction_date
)db fiddle视图
pxq42qpu2#
nxowjjhe3#
做这样的事吗?
样品