mysql - 获取查询中先前记录的总和并添加或减去以下结果

标签 mysql sql query-optimization

案例:

我选择一个初始日期和一个结束日期,它应该为我带来该日期范围内所有产品的变动,但如果在初始日期之前(表中的记录)有变动,我想获得之前的总和(上一条数据)

如果第一个 Action 是导出 5,第二个 Action 是收入 2。

我将在第一行中包含 (prevData-5),第二行中将包含 (prevData-5 + 2),因此具有累积值。

prevData 将计算为上述总和,验证记录的产品 id,我进行了查询,但如果产品有 10 次移动,我将查询 10 次,我将如何识别总和另一个product_id?

SELECT
ik.id,
ik.quantity,
ik.date,
ik.product_id,
#balance = (SELECT SUM(quantity) FROM table_kardex WHERE product_id = ik.product_id AND id < ik.id)
from table_kardex  ik
where ik.date between '2021-11-01'  and  '2021-11-15'
order by ik.product_id,ik.id asc

希望您给我理解,我会注意任何问题。

表_kardex

<表类=“s-表”> <标题> id 数量 日期 产品ID <正文> 1 8 2020-10-12 2 2 15 2020-10-12 1 3 5 2021-11-01 1 4 10 2021-11-01 2 5 -2 2021-11-02 1 6 -4 2021-11-02 2

是明显小于具有相同product_id的记录的id的总和(数量),例如id 1和2将是上一个数据

result

id|quantity|date|product_id|balance
3  5       2021-11-01  1    20  (15+5)
5  -2      2021-11-02  1    18  (15+5-2)
4  10      2021-11-01  2    18  (8+10)
6  -4      2021-11-02  2    14  (18-4)

可以用普通查询来完成,或者使用 View 或游标来完成,也许你可以指导我,我已经更改为MySQL 8。

最佳答案

如果您使用 MySQL 8+,则可以在此处使用分析函数:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY date) rn,
              SUM(quantity) OVER (PARTITION BY product_id ORDER BY date) saldo
    FROM table_kardex
    WHERE date BETWEEN '2021-11-01' AND '2021-11-15'
)

SELECT id, quantity, date, product_id, saldo
FROM cte
WHERE rn > 1
ORDER BY product_id, date;

关于mysql - 获取查询中先前记录的总和并添加或减去以下结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70691881/

相关文章:

php - 使用column.name而不是column.phpName推进集合

sql - 在 Oracle ALL_CONSTRAINTS 中仅查找用户定义的检查约束

mysql - 有没有办法获取查询结果的列名

MySql 查询花费大量时间

Hibernate 和三个表发生 java.lang.StackOverflowError

php - SQL 导出 - Wordpress 插件 DEV

php - 在各自的仪表板中使用 session 用户角色重定向用户

sql - 努力将数据集从行旋转到列

mysql - 使用自连接进行困难的 MySQL 更新查询

sql - 当一个包罗万象的 SELECT 已经运行时,为什么要运行单个 SELECT 查询? (Rails/ActiveRecord)