SQL进阶技巧:如何计算商品需求与到货队列表进出计划?
目录
0 需求描述
1 数据准备
2 问题分析
3 小结
累计到货数量计算
出货数量计算
剩余数量计算
0 需求描述
假设现有多种商品的订单需求表 DEMO_REQUIREMENT,以及商品的到货队列表 DEMO_ARR_QUEUE,要求按照业务需要,设计一个报表,展示出每种商品的到货队列,并给出每次到货应直接出货多少数量,出货后剩余多少数量,直到某批到货满足订单需求则不再统计该商品的出货计划。
1 数据准备
-- 创建商品需求表并插入示例数据
CREATE TABLE demo_requirement (item_id INT,req_qty INT
);INSERT INTO demo_requirement VALUES-- 创建商品需求表并插入示例数据
CREATE TABLE demo_requirement (item_id INT,req_qty INT
);INSERT INTO demo_requirement VALUES
(1, 60),
(2, 100),
(3, 80),
(4, 90);-- 创建商品到货队列表并插入示例数据
CREATE TABLE demo_arr_queue (arr_id INT,item_id INT,arr_qty INT
);INSERT INTO demo_arr_queue VALUES
(10, 1, 60),
(11, 1, 50),
(12, 2, 40),
(13, 2, 60),
(14, 3, 20),
(15, 3, 50),
(16, 3, 50),
(17, 4, 40),
(18, 4, 40);
2 问题分析
步骤1:每个商品每次到货的累计到货数量及对应需求数量
-- 计算每个商品每次到货时累计到货数量以及对应需求数量(通过连接获取),作为中间结果展示
SELECTdaq.item_id,daq.arr_id,daq.arr_qty,SUM(daq.arr_qty) OVER (PARTITION BY daq.item_id ORDER BY daq.arr_id) AS cumulative_arrival_qty,dr.req_qty
FROMdemo_arr_queue daq
-- 左连接商品需求表,以便获取每个商品的需求数量
LEFT JOIN demo_requirement dr ON daq.item_id = dr.item_id
ORDER BYdaq.item_id,daq.arr_id;
item_id | arr_id | arr_qty | cumulative_arrival_qty | req_qty |
---|---|---|---|---|
1 | 10 | 60 | 60 | 60 |
1 | 11 | 50 | 110 | 60 |
2 | 12 | 40 | 40 | 100 |
2 | 13 | 60 | 100 | 100 |
3 | 14 | 20 | 20 | 80 |
3 | 15 | 50 | 70 | 80 |
3 | 16 | 50 | 120 | 80 |
4 | 17 | 40 | 40 | 90 |
4 | 18 | 40 | 80 | 90 |
这个中间结果展示了每个商品每次到货的基本信息(到货批次 ID、到货数量),以及通过窗口函数计算出的累计到货数量,还有通过左连接获取到的对应商品需求数量,方便后续基于这些数据去进一步计算出货量和剩余数量。
步骤2:基于中间结果计算出货量和剩余量
-- 基于前面的中间结果进一步计算出货量和剩余量,展示最终结果
SELECTsub.item_id,sub.arr_id,sub.arr_qty,-- 计算出货数量CASEWHEN sub.cumulative_arrival_qty <= sub.req_qtyTHEN LEAST(sub.arr_qty, sub.req_qty - (sub.cumulative_arrival_qty - sub.arr_qty))ELSE 0END AS shipment_quantity,-- 计算剩余数量CASEWHEN sub.cumulative_arrival_qty < sub.req_qtyTHEN sub.req_qty - sub.cumulative_arrival_qtyWHEN sub.cumulative_arrival_qty = sub.req_qtyTHEN 0ELSE sub.cumulative_arrival_qty - sub.req_qtyEND AS remaining_quantity
FROM (-- 这里是前面计算累计到货数量和获取需求数量的中间结果SELECTdaq.item_id,daq.arr_id,daq.arr_qty,SUM(daq.arr_qty) OVER (PARTITION BY daq.item_id ORDER BY daq.arr_id) AS cumulative_arrival_qty,dr.req_qtyFROMdemo_arr_queue daqLEFT JOIN demo_requirement dr ON daq.item_id = dr.item_idORDER BYdaq.item_id,daq.arr_id
) sub
ORDER BYsub.item_id,sub.arr_id;
item_id | arr_id | arr_qty | shipment_quantity | remaining_quantity |
---|---|---|---|---|
1 | 10 | 60 | 60 | 0 |
1 | 11 | 50 | 0 | 50 |
2 | 12 | 40 | 40 | 60 |
2 | 13 | 60 | 60 | 0 |
3 | 14 | 20 | 20 | 60 |
3 | 15 | 50 | 50 | 10 |
3 | 16 | 50 | 10 | 40 |
4 | 17 | 40 | 40 | 50 |
4 | 18 | 40 | 40 | 10 |
3 小结
本文主要的思路如下:
累计到货数量计算
使用窗口函数
运用 SUM
函数结合 OVER
子句来计算每个商品的累计到货数量。具体而言,在对 DEMO_ARR_QUEUE
表进行查询时,通过 PARTITION BY
按照商品 ID(item_id
)对数据进行分区,这样就可以针对每个商品独立地进行计算。然后使用 ORDER BY
按照到货批次 ID(arr_id
)进行排序,确保累计计算是按照到货的先后顺序进行的。例如:
SUM(arr_qty) OVER (PARTITION BY item_id ORDER BY arr_id) AS cumulative_arrival_qty
- 这个表达式会为每个商品的每一行数据计算出从第一行到当前行的到货数量总和,也就是累计到货数量。
出货数量计算
条件判断逻辑
首先进行一个主要的条件判断,即比较当前商品的累计到货数量(cumulative_arrival_qty
)与订单需求数量(req_qty
)的大小关系。使用 CASE WHEN
语句来实现:
CASEWHEN cumulative_arrival_qty <= req_qty
- 如果累计到货数量小于等于订单需求数量,说明还未完全满足订单或者刚好满足订单。此时,出货数量的计算需要进一步考虑当前到货数量(
arr_qty
)和订单需求剩余数量。订单需求剩余数量可以通过订单需求数量减去之前已经累计到货但未出货的数量得到,即req_qty - (cumulative_arrival_qty - arr_qty)
。然后使用LEAST
函数取当前到货数量和订单需求剩余数量中的较小值作为出货数量:
THEN LEAST(arr_qty, req_qty - (cumulative_arrival_qty - arr_qty))
- 如果累计到货数量大于订单需求数量,说明订单已经满足,此时出货数量为 0:
ELSE 0
END AS shipment_quantity
剩余数量计算
分情况处理
同样使用 CASE WHEN
语句来处理不同情况。
当累计到货数量小于订单需求数量时,剩余数量就是订单需求数量减去累计到货数量:
CASEWHEN cumulative_arrival_qty < req_qtyTHEN req_qty - cumulative_arrival_qty
- 当累计到货数量等于订单需求数量时,剩余数量为 0:
WHEN cumulative_arrival_qty = req_qtyTHEN 0
- 当累计到货数量大于订单需求数量时,剩余数量为累计到货数量减去订单需求数量:
ELSE cumulative_arrival_qty - req_qty
END AS remaining_quantity
如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。
专栏 原价99,现在活动价59.9,按照阶梯式增长,还差5个人上升到69.9,最终恢复到原价。
专栏优势:
(1)一次收费持续更新。
(2)实战中总结的SQL技巧,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战技巧,方法独特】
SQL很简单,可你却写不好?每天一点点,收获不止一点点-CSDN博客
(3)实战中数仓建模技巧总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(如果只懂数据建模而不懂业务建模,数仓体系认知是不全面的
(4)数字化建设当中遇到难题解决思路及问题思考。
我的专栏具体链接如下
数字化建设通关指南_莫叫石榴姐的博客-CSDN博客
相关文章:

SQL进阶技巧:如何计算商品需求与到货队列表进出计划?
目录 0 需求描述 1 数据准备 2 问题分析 3 小结 累计到货数量计算 出货数量计算 剩余数量计算 0 需求描述 假设现有多种商品的订单需求表 DEMO_REQUIREMENT,以及商品的到货队列表 DEMO_ARR_QUEUE,要求按照业务需要,设计一个报表&#…...

linux普通用户使用sudo不需要输密码
1.root用户如果没有密码,先给root用户设置密码 sudo passwd root #设置密码 2.修改visudo配置 su #切换到root用户下 sudo visudo #修改visudo配置文件 用户名 ALL(ALL) NOPASSWD: ALL #下图所示处新增一行配置 用户名需要输入自己当前主机的用户名...

Mac配置 Node镜像源的时候报错解决办法
在Mac电脑中配置国内镜像源的时候报错,提示权限问题,无法写入配置文件。本文提供解决方法,青测有效。 一、原因分析 遇到的错误是由于 .npm 目录下的文件被 root 用户所拥有,导致当前用户无法写入相关配置文件。 二、解决办法 在终端输入以下命令,输入管理员密码即可。 su…...

R语言的数据结构-数据框
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 在医学领域中,R语言的数据框(…...

分布式全文检索引擎ElasticSearch-数据的写入存储底层原理
一、数据写入的核心流程 当向 ES 索引写入数据时,整体流程如下: 1、客户端发送写入请求 客户端向 ES 集群的任意节点(称为协调节点,Coordinating Node)发送一个写入请求,比如 index(插入或更…...

react中实现导出excel文件
react中实现导出excel文件 一、安装依赖二、实现导出功能三、自定义列标题四、设置列宽度五、样式优化1、安装扩展库2、设置样式3、扩展样式功能 在 React 项目中实现点击按钮后导出数据为 Excel 文件,可以使用 xlsx 和 file-saver 这两个库。 一、安装依赖 在项目…...

有监督学习 vs 无监督学习:机器学习的两大支柱
有监督学习 vs 无监督学习:机器学习的两大支柱 有监督学习 vs 无监督学习:机器学习的两大支柱一、有无“老师”来指导二、解决的问题类型不同三、模型的输出不同 有监督学习 vs 无监督学习:机器学习的两大支柱 在机器学习的奇妙世界里&#…...

c4d动画怎么导出mp4视频,c4d动画视频格式设置
宝子们,今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的,让你能轻松理解和掌握,不管是理论基础,还是实际操作和技能技巧,都能学到,快速入门然后提升自己哦。 c4d动…...

差分矩阵(Difference Matrix)与累计和矩阵(Running Sum Matrix)的概念与应用:中英双语
本文是学习这本书的笔记: https://web.stanford.edu/~boyd/vmls/ 差分矩阵(Difference Matrix)与累计和矩阵(Running Sum Matrix)的概念与应用 在线性代数和信号处理等领域中,矩阵运算常被用来表示和计算各种数据变换…...
全面解析 Golang Gin 框架
1. 引言 在现代 Web 开发中,随着需求日益增加,开发者需要选择合适的工具来高效地构建应用程序。对于 Go 语言(Golang)开发者来说,Gin 是一个备受青睐的 Web 框架。它轻量、性能高、易于使用,并且具备丰富的…...
全脐点曲面当且仅当平面或者球面的一部分
S 是全脐点曲面当且仅当 S 是平面或者球面的一部分。 S_\text{ 是全脐点曲面当且仅当 }{S_\text{ 是平面或者球面的一部分。}} S 是全脐点曲面当且仅当 S 是平面或者球面的一部分。 证: 充分性显然,下证必要性。 若 r ( u , v ) r(u,v) r(u,v)是…...

CSS学习记录18
CSS渐变 CSS渐变您可以显示两种或多种指定颜色之间的平滑过渡。 CSS定义了两种渐变类型: 线性渐变(向下/向上/向左/向右/对角线)径向渐变(由其中心定义) CSS线性渐变 如需创建线性渐变,您必须至少两个色…...

实验13 C语言连接和操作MySQL数据库
一、安装MySQL 1、使用包管理器安装MySQL sudo apt update sudo apt install mysql-server2、启动MySQL服务: sudo systemctl start mysql3、检查MySQL服务状态: sudo systemctl status mysql二、安装MySQL开发库 sudo apt-get install libmysqlcli…...

90度Floating B to B 高速连接器信号完整性仿真
在180度 B to B Connector 信号完整性仿真时,不会碰到端口设置不方便问题,但在做90度B to B Connector信号完整性仿真时就会碰到端口设置问题。如下面的90度B to B Connector。 公座 母座 公母对插后如下: 客户要求改Connector需符合PCI-E3.…...

【踩坑】Pytorch与CUDA版本的关系及安装
Pytorch、CUDA和CUDA Toolkit区分 查看当前环境常用shell命令python脚本 Driver API CUDA(nvidia-smi)Runtime API CUDA(nvcc --version)pytorch选择CUDA版本的顺序安装需要的CUDA,多版本共存和自由切换 本文参考 http…...
信息隐藏 数字图像空域隐写与分析技术的实现
数字图像隐写与分析 摘要 随着信息技术的发展,隐写术作为一种信息隐藏技术,越来越受到关注。本文介绍了一种基于最低有效位(LSB)方法的数字图像隐写技术,并实现了隐写数据的嵌入与提取。通过卡方检验分析隐写图像的统计特性,评估隐写数据对图像的影响。实验结果表明,该…...
halcon单相机+机器人*眼在手外标定心得
目的 得到相机坐标系下的点与机器人底座base的转换关系,camera_in_base 两个不确定的定量 1,相机与机器人底座base之间的相对位置是固定的,既camera_in_base 2,机械手末端与标定物 tool_in_obj是固定的 辅助确定量 工作台与相…...
pytest入门十:配置文件
pytest.ini:pytest的主配置文件,可以改变pytest的默认行为conftest.py:测试用例的一些fixture配置 pytest.ini marks mark 打标的执行 pytest.mark.add add需要些marks配置否则报warning [pytest] markersadd:测试打标 测试用例中添加了 p…...

基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架
基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架 论文大纲理解1. 确认目标2. 目标-手段分析3. 实现步骤4. 金手指分析 全流程核心模式核心模式提取压缩后的系统描述核心创新点 数据分析第一步:数据收集第二步:规律挖掘第三步&am…...
介绍 Html 和 Html 5 的关系与区别
HTML(HyperText Markup Language)是构建网页的标准标记语言,而 HTML5 是 HTML 的最新版本,包含了一些新的功能、元素、API 和属性。HTML5 相对于早期版本的 HTML(比如 HTML4)有许多重要的改进和变化。以下是…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...