做内容的网站,2022年装修效果图大全,网站运营如何做,品牌网app下载mysql如何不使用窗口函数#xff0c;去统计出入库情况
你把这个表看做 进出库表#xff0c;每个物料把时间正序后 依次累加数量 #xff0c;看这个物料的时间线上 是否会出现负数#xff0c;1号进货5个 2号出库3个 3号你不能出库3个 最多俩个 不然就是负库存#xff0c;…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 进行累加库存累加时一旦发现某一天的库存变为负数就可以将其标记为库存不足。
这个查询需要以下步骤
按照 material_code 和 invoice_date 将数据按时间升序排列。对于每个物料逐步累加 quantity同时判断是否有任何时间点的库存是负数。使用 变量 来累加数量并检查是否为负数而不使用窗口函数。
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 quantityELSE quantityEND 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;解释
current_stock一个变量记录每个物料的当前累积库存。prev_material记录前一个物料的 material_code以确保如果物料切换库存会重新计算。累加逻辑如果当前物料与上一个相同累加库存。如果物料变了重置库存累加。库存检查如果某个时间点的库存小于 0会标记为 库存不足。
执行结果示例
material_codeinvoice_datequantitystock_after_transactionstock_statusA2024-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_code 和 invoice_date 的 quantity 进行汇总之后再按照时间顺序进行库存的累加和检查。
更新的 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_quantityELSE total_quantityEND 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_quantityFROM your_tableGROUP BY material_code, invoice_date
) AS aggregated_table
ORDER BY material_code, invoice_date;解释 内部子查询 aggregated_table 通过 GROUP BY material_code, invoice_date 对相同物料、相同日期的数据进行聚合使用 SUM(quantity) 来计算每天的总数量。 外部查询 使用变量 current_stock 来进行库存累加逻辑与之前相同。如果物料切换库存重新计算。继续检查库存是否为负数并根据结果显示 “库存不足” 或 “库存充足”。
执行结果示例
material_codeinvoice_datetotal_quantitystock_after_transactionstock_statusA2024-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 是经过日期聚合后的数量。之后的逻辑和之前一样累加库存并检查是否为负。
这样查询会先对同一天的数量进行汇总然后再按照日期累加库存确保你可以监控到任何可能出现负库存的情况。