案例:我选择了一个初始日期和一个结束日期,它应该为我带来该日期范围内所有产品的移动,但是如果在初始日期之前有变动(表中的记录),我想获得前一个和(prevData)。
如果第一步是第5出口,第二步是收入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我希望你给我的理解,我会注意任何问题。
#table_kardex
id|quantity|date|product_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
#result
id|quantity|date|product_id|saldo
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-4)
6 -4 2021-11-02 2 14 (15+5-2)使用MySQL 5.7
发布于 2022-01-13 05:42:52
如果您使用的是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;发布于 2022-01-13 05:47:32
最简单的解决方案是使用window函数SUM OVER来获得正在运行的总数。在第二步中,将其缩减到您希望启动的日期:
SELECT id, quantity, date, product_id, balance
FROM
(
SELECT
id,
quantity,
date,
product_id,
SUM(quantity) OVER (PARTITION BY product_id ORDER BY id) AS balance
from table_kardex ik
where date < DATE '2021-11-16'
) cumulated
WHERE date >= DATE '2021-11-01'
ORDER BY product_id, id;更新:您更改了请求的,以提及您使用的是旧的MySQL版本(5.7)。这不支持窗口函数。在这种情况下,使用原始查询。不过,如果我没有弄错的话,#balance = (...)是MySQL的无效语法。根据你的解释,你想要的是id <= ik.id而不是id < ik.id
SELECT
ik.id,
ik.quantity,
ik.date,
ik.product_id,
(
SELECT SUM(quantity)
FROM table_kardex
WHERE product_id = ik.product_id AND id <= ik.id
) AS balance
FROM table_kardex ik
WHERE ik.date >= DATE '2021-11-01' AND ik.date < DATE '2021-11-16'
ORDER BY ik.product_id, ik.id;此查询的适当索引如下:
create index idx1 on table_kardex (date, product_id, id);
create index idx2 on table_kardex (product_id, id, quantity);发布于 2022-01-13 05:53:12
MySQL 5.7
试试这个:
SELECT *
FROM (
SELECT product_id,
t1.`date`,
SUM(t2.quantity) - t1.quantity cumulative_quantity_before,
SUM(t2.quantity) cumulative_quantity_after
FROM table t1
JOIN table t2 USING (product_id)
WHERE t1.`date` >= t2.`date`
AND t1.`date` <= @period_end
GROUP BY product_id, t1.`date`, t1.quantity
) prepare_data
WHERE `date` >= @period_start;https://stackoverflow.com/questions/70691881
复制相似问题