当前位置: 首页 > article >正文

mysql如何不使用窗口函数,去统计出入库情况

mysql如何不使用窗口函数,去统计出入库情况

你把这个表看做 进出库表,每个物料把时间正序后 依次累加数量 ,看这个物料的时间线上 是否会出现负数,1号进货5个 2号出库3个  3号你不能出库3个 最多俩个 不然就是负库存,说白 就是按时间线累加每天的数据 每个时间线不能出现 负数。需要用mysql 写出来   aa date num A 2024-01-03   2 B 2024-01-05   -2  。要求不能使用窗口函数。    CREATE TABLE your_table (
    material_code VARCHAR(10),
    invoice_date DATE,
    quantity INT
);

INSERT INTO your_table (material_code, invoice_date, quantity)
VALUES
    ('A', '2024-01-03', 2),
    ('A', '2024-01-04', 4),
    ('A', '2024-01-05', -2),
    ('A', '2024-01-05', -5),
    ('A', '2024-01-05', 5),
    ('A', '2024-01-06', -9),
    ('A', '2024-01-07', 5),
    ('B', '2024-01-03', 2),
    ('B', '2024-01-04', 4),
    ('B', '2024-01-05', -2),
    ('B', '2024-01-05', -5),
    ('B', '2024-01-05', 5),
    ('B', '2024-01-06', -9),
    ('B', '2024-01-07', 5);

你要通过 MySQL 查询每个物料的库存变化,并检查在时间线上的库存是否会出现负数。在这个场景下,我们需要按照 invoice_date 进行累加库存,累加时一旦发现某一天的库存变为负数,就可以将其标记为库存不足。

这个查询需要以下步骤:

  1. 按照 material_codeinvoice_date 将数据按时间升序排列。
  2. 对于每个物料,逐步累加 quantity,同时判断是否有任何时间点的库存是负数。
  3. 使用 变量 来累加数量并检查是否为负数,而不使用窗口函数。

MySQL 查询:

-- 定义变量
SET @current_stock = 0;
SET @prev_material = '';

-- 查询每个物料的时间线库存变化,查看是否出现负数
SELECT material_code, invoice_date, quantity, @current_stock := 
    CASE 
        WHEN @prev_material = material_code THEN @current_stock + quantity
        ELSE quantity
    END AS stock_after_transaction,
    @prev_material := material_code AS material_code_check,
    CASE 
        WHEN @current_stock < 0 THEN '库存不足'
        ELSE '库存充足'
    END AS stock_status
FROM your_table
ORDER BY material_code, invoice_date;

解释:

  1. @current_stock:一个变量,记录每个物料的当前累积库存。
  2. @prev_material:记录前一个物料的 material_code,以确保如果物料切换,库存会重新计算。
  3. 累加逻辑:如果当前物料与上一个相同,累加库存。如果物料变了,重置库存累加。
  4. 库存检查:如果某个时间点的库存小于 0,会标记为 库存不足

执行结果示例:

material_codeinvoice_datequantitystock_after_transactionstock_status
A2024-01-0322库存充足
A2024-01-0446库存充足
A2024-01-05-24库存充足
A2024-01-05-5-1库存不足
A2024-01-0554库存充足
A2024-01-06-9-5库存不足
A2024-01-0750库存充足
B2024-01-0322库存充足
B2024-01-0446库存充足
B2024-01-05-24库存充足
B2024-01-05-5-1库存不足
B2024-01-0554库存充足
B2024-01-06-9-5库存不足
B2024-01-0750库存充足

说明:

  • stock_after_transaction 是每个时间点的库存。
  • stock_status 表明库存是否充足,当库存低于 0 时显示 “库存不足”。

通过这个查询,你可以监控物料的库存变化,并及时发现负库存的情况。

============================================

=============================================================

【第二版:日期聚合】

好的,理解你的意思了。你希望在相同日期的 quantity 先进行聚合,然后再按日期累加库存变化。

我们可以在查询中加入一个聚合步骤,先对相同 material_codeinvoice_datequantity 进行汇总,之后再按照时间顺序进行库存的累加和检查。

更新的 MySQL 查询:

-- 定义变量
SET @current_stock = 0;
SET @prev_material = '';

-- 先对相同日期的数量进行聚合,再按日期累加库存并检查是否为负
SELECT material_code, invoice_date, total_quantity, 
       @current_stock := 
       CASE 
           WHEN @prev_material = material_code THEN @current_stock + total_quantity
           ELSE total_quantity
       END AS stock_after_transaction,
       @prev_material := material_code AS material_code_check,
       CASE 
           WHEN @current_stock < 0 THEN '库存不足'
           ELSE '库存充足'
       END AS stock_status
FROM (
    -- 聚合相同日期的数量
    SELECT material_code, invoice_date, SUM(quantity) AS total_quantity
    FROM your_table
    GROUP BY material_code, invoice_date
) AS aggregated_table
ORDER BY material_code, invoice_date;

解释:

  1. 内部子查询 aggregated_table

    • 通过 GROUP BY material_code, invoice_date 对相同物料、相同日期的数据进行聚合,使用 SUM(quantity) 来计算每天的总数量。
  2. 外部查询

    • 使用变量 @current_stock 来进行库存累加,逻辑与之前相同。如果物料切换,库存重新计算。
    • 继续检查库存是否为负数,并根据结果显示 “库存不足” 或 “库存充足”。

执行结果示例:

material_codeinvoice_datetotal_quantitystock_after_transactionstock_status
A2024-01-0322库存充足
A2024-01-0446库存充足
A2024-01-05-24库存充足
A2024-01-06-9-5库存不足
A2024-01-0750库存充足
B2024-01-0322库存充足
B2024-01-0446库存充足
B2024-01-05-24库存充足
B2024-01-06-9-5库存不足
B2024-01-0750库存充足

说明:

  • total_quantity 是经过日期聚合后的数量。
  • 之后的逻辑和之前一样,累加库存并检查是否为负。

这样,查询会先对同一天的数量进行汇总,然后再按照日期累加库存,确保你可以监控到任何可能出现负库存的情况。


http://www.kler.cn/news/327794.html

相关文章:

  • 全视通智慧养老护理呼叫求助,打造安心舒适的养老生活
  • JavaScript 可视化案例详解
  • 了解Webpack并处理样式文件
  • 黑马头条day5- 延迟任务精准发布文章
  • NVIDIA Hopper 架构深入
  • spring cache,Spring data redis
  • OpenCV视频I/O(5)视频采集类VideoCapture之从视频流中获取下一帧的函数grab()的使用
  • 【mod分享】山脊赛车无限高清重置mod,替换高清贴图和光影材质,可实现reshade光追
  • Oracle(145)如何进行数据库的日常维护?
  • Map put的过程
  • ELK--收集日志demo
  • 清美项目 vue总结
  • PPT 快捷键使用、技巧
  • 卷积神经网络(CNN)的计算量和参数怎么准确估计?
  • 独立样本t检验及其案例分析
  • 代码训练营 day17|LeetCode 235,LeetCode 701,LeetCode 450
  • 线性方程组的迭代方法
  • IP协议讲解
  • 唱响红色志愿,赞歌献给祖国——杭州建德市庆祝中华人民共和国成立75周年联欢盛宴纪实
  • 等保测评中的密码学应用分析
  • Artec Leo 3D扫描助力Illumaesthetic公司加速汽车定制
  • DCIM系统的作用
  • 【Power Query】M函数-List.Sum
  • OpenCV视频I/O(7)视频采集类VideoCapture之初始化视频捕获设备或打开一个视频文件函数open()的使用
  • css 边框流光效果
  • 算法刷题笔记 约数个数(详细注释的C++实现)
  • 钉钉如何请求webhook发送信息
  • 基于JAVA+SpringBoot+Vue的校园商铺管理系统
  • Java之线程篇七
  • 解读 Story Protocol:IP 与区块链的潜力与障碍