首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取查询中先前记录的和,并添加或减去以下结果

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

Stack Overflow用户
提问于 2022-01-13 05:33:54
回答 3查看 62关注 0票数 1

案例:我选择了一个初始日期和一个结束日期,它应该为我带来该日期范围内所有产品的移动,但是如果在初始日期之前有变动(表中的记录),我想获得前一个和(prevData)。

如果第一步是第5出口,第二步是收入2。

我将在第一行(PrevData 5),第二行(prevData 5+ 2),因此有一个累积。

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

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
#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

EN

回答 3

Stack Overflow用户

发布于 2022-01-13 05:42:52

如果您使用的是MySQL 8+,那么在这里可以使用解析函数:

代码语言:javascript
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2022-01-13 05:47:32

最简单的解决方案是使用window函数SUM OVER来获得正在运行的总数。在第二步中,将其缩减到您希望启动的日期:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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;

此查询的适当索引如下:

代码语言:javascript
运行
复制
create index idx1 on table_kardex (date, product_id, id);
create index idx2 on table_kardex (product_id, id, quantity);
票数 1
EN

Stack Overflow用户

发布于 2022-01-13 05:53:12

MySQL 5.7

试试这个:

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70691881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档