SQL进阶技巧:如何计算商品需求与到货队列表进出计划?

news2024/12/21 14:27:38

目录

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:每个商品每次到货的累计到货数量及对应需求数量

-- 计算每个商品每次到货时累计到货数量以及对应需求数量(通过连接获取),作为中间结果展示
SELECT
    daq.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
FROM
    demo_arr_queue daq
-- 左连接商品需求表,以便获取每个商品的需求数量
LEFT JOIN demo_requirement dr ON daq.item_id = dr.item_id
ORDER BY
    daq.item_id,
    daq.arr_id;
item_idarr_idarr_qtycumulative_arrival_qtyreq_qty
110606060
1115011060
2124040100
21360100100
314202080
315507080
3165012080
417404090
418408090

这个中间结果展示了每个商品每次到货的基本信息(到货批次 ID、到货数量),以及通过窗口函数计算出的累计到货数量,还有通过左连接获取到的对应商品需求数量,方便后续基于这些数据去进一步计算出货量和剩余数量。

步骤2:基于中间结果计算出货量和剩余量

-- 基于前面的中间结果进一步计算出货量和剩余量,展示最终结果
SELECT
    sub.item_id,
    sub.arr_id,
    sub.arr_qty,
    -- 计算出货数量
    CASE
        WHEN sub.cumulative_arrival_qty <= sub.req_qty
        THEN LEAST(sub.arr_qty, sub.req_qty - (sub.cumulative_arrival_qty - sub.arr_qty))
        ELSE 0
    END AS shipment_quantity,
    -- 计算剩余数量
    CASE
        WHEN sub.cumulative_arrival_qty < sub.req_qty
        THEN sub.req_qty - sub.cumulative_arrival_qty
        WHEN sub.cumulative_arrival_qty = sub.req_qty
        THEN 0
        ELSE sub.cumulative_arrival_qty - sub.req_qty
    END AS remaining_quantity
FROM (
    -- 这里是前面计算累计到货数量和获取需求数量的中间结果
    SELECT
        daq.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
    FROM
        demo_arr_queue daq
    LEFT JOIN demo_requirement dr ON daq.item_id = dr.item_id
    ORDER BY
        daq.item_id,
        daq.arr_id
) sub
ORDER BY
    sub.item_id,
    sub.arr_id;

 

item_idarr_idarr_qtyshipment_quantityremaining_quantity
11060600
11150050
212404060
21360600
314202060
315505010
316501040
417404050
418404010

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 语句来实现:

CASE
    WHEN 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 语句来处理不同情况。

当累计到货数量小于订单需求数量时,剩余数量就是订单需求数量减去累计到货数量:

CASE
    WHEN cumulative_arrival_qty < req_qty
    THEN req_qty - cumulative_arrival_qty
  • 当累计到货数量等于订单需求数量时,剩余数量为 0:
    WHEN cumulative_arrival_qty = req_qty
    THEN 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博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

清远榉之乡托养机构为你深度分析:特殊碳水化合物饮食对自闭症的作用

在探索自闭症干预方法的道路上&#xff0c;各种尝试不断涌现。其中&#xff0c;特殊碳水化合物饮食引起了不少家长的关注。那么&#xff0c;特殊碳水化合物饮食对自闭症究竟有怎样的作用呢&#xff1f;今天&#xff0c;清远榉之乡托养机构为你深度分析。 榉之乡大龄自闭症托养机…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览

ONES Copilot 可基于工作项的标题、描述、属性信息&#xff0c;对工作项产生的动态和评论生成总结。 针对不同类型的工作项&#xff0c;总结输出的内容有对应的侧重点。 应用场景&#xff1a; 在一些流程步骤复杂、上下游参与成员角色丰富的场景中&#xff0c;工作项动态往往会…

leecode494.目标和

这道题目第一眼感觉就不像是动态规划&#xff0c;可以看出来是回溯问题&#xff0c;但是暴力回溯超时&#xff0c;想要用动态规划得进行一点数学转换 class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int nnums.size(),bagWeight0,s…

python使用Flask框架创建一个简单的动态日历

0. 运行效果 运行代码&#xff0c;然后在浏览器中访问 http://127.0.0.1:5000/&#xff0c;将看到一个动态日历&#xff0c;能够通过点击按钮切换月份。 1. 安装 Flask 首先&#xff0c;确保你已经安装了Flask。如果没有&#xff0c;可以使用以下命令安装&#xff1a; pip i…

一键优化Linux服务器性能(One Click Optimization of Linux Server Performance)

服务器上线之一键优化Linux服务器性能 以下是一个简单的Shell脚本&#xff0c;用于执行服务器上线优化的一些基本步骤。请注意&#xff0c;这个脚本是基于一个通用的Linux服务器配置&#xff0c;您可能需要根据您的具体需求和环境进行调整。 功能如下&#xff1a; 1.关闭SEL…

【电脑技巧】将键盘的方向键映射为alt+i、k、j、l

最近感觉方向键太远了&#xff0c;想找个方法修改键盘映射&#xff0c;有几种方式可以实现 使用powertoys的键盘映射&#xff08;软件太大了&#xff0c;只为键盘映射不值得下这个&#xff09;使用autohotkey&#xff08;通过脚本的方式&#xff0c;可以打包成exe文件&#xf…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

文件防泄漏 | 文件防泄漏软件解决方案分享,网络数据泄露防护系统

文件防泄漏 | 文件防泄漏软件解决方案分享&#xff0c;网络数据泄露防护系统 企业面临的一大挑战是数据安全和隐私保护。 网络数据泄露不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户关系。 为了应对这一挑战&#xff0c;域智盾软件应运而生&#xff0c;成为众多企…

11篇--图像边缘检测

图像梯度 要学习图像边缘检测&#xff0c;要先了解图像梯度的概念&#xff0c;我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大&#xff08;不然不会有边缘呈现&#xff09;&#xff0c;所以给边缘附近的的梯度之变化很快&#xff0c;通过…

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH &#xff08;1&#xff09;w25flash.h &#xff08;2&#xff09; w25flash.c 1&#xff09;W25Q16基本操作指令 2&#xff09;计算地址的辅助功能函数 3&#xff09;器…

.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时&#xff0c;报错 &#xff1a; System.Drawing.Common is not supported on this platform 平台特定实现&#xff1a; 对于Windows平台&#xff0c;System.Drawing.C…

岁末回望,追梦远方

又到了岁末年初&#xff0c;按惯例&#xff0c;风云我都会写一篇长长的感悟&#xff0c;给自己辞旧的总结复盘&#xff0c;迎新的追梦定调&#xff0c;今年赋诗一首&#xff0c;畅想一下诗和远方&#xff0c;简洁而又虚无&#xff0c;缥缈中坚定初心。 岁末回首步履深&#xf…

作业Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

混凝土-钢板结构抗剪性能DIC全场应变测试

混凝土-钢板结构发挥了钢板抗拉及混凝土抗压的特点&#xff0c;为建筑设计、选材、施工等过程带来了更多的可能性。构件将混凝土与钢板结合&#xff0c;从而改善抗剪承载性能&#xff0c;提升建筑性能。 采用3D-DIC非接触式三维全场应变测量技术&#xff0c;对构件的抗剪承载力…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

音频开发中常见的知识体系

在 Linux 系统中&#xff0c;/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义&#xff1a; 一.基本术语 样本长度(sample)&#xff1a;样本是记录音频数据最基本的单位&#xff0c;计算机对每个通道采…

Linux setfacl 命令详解

文章目录 Linux setfacl 命令详解一、ACL 和 setfacl 简介二、基本语法三、常用操作1. 查看 ACL2. 为用户设置权限3. 为组设置权限4. 删除 ACL 条目5. 设置默认 ACL6. 递归设置 ACL 四、示例操作1. 创建示例目录和文件2. 设置 ACL3. 验证 ACL 五、注意事项六、总结 Linux setfa…

编程训练系统(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足&#xff0c;创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…