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

-- 计算每个商品每次到货时累计到货数量以及对应需求数量(通过连接获取),作为中间结果展示
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博客 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“调用函数”多出一个None

Python中函数缺省返回空值&#xff0c;试图打印没有return的函数都将是None。 (笔记模板由python脚本于2024年12月20日 19:59:03创建&#xff0c;本篇笔记适合会自定义python函数的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fre…

Flask内存马学习

文章目录 参考文章环境搭建before_request方法构造内存马after_request方法构造内存马errorhandler方式构造内存马add_url_rule方式构造内存马 参考文章 https://www.mewo.cc/archives/10/ https://www.cnblogs.com/gxngxngxn/p/18181936 前人栽树, 后人乘凉 大佬们太nb了, …

在Win11系统上安装Android Studio

诸神缄默不语-个人CSDN博文目录 下载地址&#xff1a;https://developer.android.google.cn/studio?hlzh-cn 官方安装教程&#xff1a;https://developer.android.google.cn/studio/install?hlzh-cn 点击Next&#xff0c;默认会同时安装Android Studio和Android虚拟机&#…

Python读取Excel批量写入到PPT生成词卡

一、问题的提出 有网友想把Excel表中的三列数据&#xff0c;分别是&#xff1a;单词、音标和释义分别写入到PPT当中&#xff0c;每一张PPT写一个单词的内容。这种批量操作是python的强项&#xff0c;尤其是在办公领域&#xff0c;它能较好地解放双手&#xff0c;读取Excel表后…

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…

ChatGPT生成接口测试用例(二)

5.1.4 自动生成测试数据 测试数据的生成通常是接口测试的一个烦琐任务。ChatGPT可以帮助测试团队生成测试数据&#xff0c;包括各种输入和它们的组合。测试人员可以描述他们需要的数据类型和范围&#xff0c;ChatGPT可以生成符合要求的测试数据&#xff0c;从而减轻测试人员的负…

空天地遥感数据识别与计算--数据分析如何助力农林牧渔、城市发展、地质灾害监测等行业革新

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

使用ZLMediaKit 开源项目搭建RTSP 服务器

ZLMediaKit 是啥&#xff1f; ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 官网 ZLMediaKit开源地址&…

Pytorch | 利用BIM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用BIM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集BIM介绍基本原理算法流程特点应用场景 BIM代码实现BIM算法实现攻击效果 代码汇总bim.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分…

同步异步日志系统:前置知识

一、日志项目的介绍 1.1 为什么要有日志系统 1、⽣产环境的产品为了保证其稳定性及安全性是不允许开发⼈员附加调试器去排查问题&#xff0c;可以借助日志系统来打印⼀些⽇志帮助开发⼈员解决问题 为什么不直接printf打印在屏幕上呢&#xff1f;&#xff1f;因为现实中没有…

搭建私有链

文章目录 1. 准备工作2. 创建创世区块配置文件2.1 创建数据目录2.2 创建创世区块配置文件1. “config”部分2. “alloc”部分3. “coinbase”4. “difficulty”5. “extraData”6. “gasLimit”7. “nonce”8. “mixhash”9. “parentHash”10. “timestamp” 3. 初始化&#x…

国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异

在现代安防视频监控系统中&#xff0c;国标GB28181协议作为公共安全视频监控联网系统的国家标准&#xff0c;该协议不仅规范了视频监控系统的信息传输、交换和控制技术要求&#xff0c;还为不同厂商设备之间的互联互通提供了统一的框架。EasyGBS平台基于GB28181协议&#xff0c…

详细解读TISAX认证的意义

详细解读TISAX认证的意义&#xff0c;犹如揭开信息安全领域的一颗璀璨明珠&#xff0c;它不仅代表了企业在信息安全管理方面的卓越成就&#xff0c;更是通往全球汽车供应链信任桥梁的关键一环。TISAX&#xff0c;即“Trusted Information Security Assessment Exchange”&#…

Pytorch | 从零构建AlexNet对CIFAR10进行分类

Pytorch | 从零构建AlexNet对CIFAR10进行分类 CIFAR10数据集AlexNet网络结构技术创新点性能表现影响和意义 AlexNet结构代码详解结构代码代码详解特征提取层 self.features分类部分self.classifier前向传播forward 训练过程和测试结果代码汇总alexnet.pytrain.pytest.py CIFAR1…

初学stm32 --- 系统时钟配置

众所周知&#xff0c;时钟系统是 CPU 的脉搏&#xff0c;就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32 的时钟系统比较复杂&#xff0c;不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问&#xff0c;采用一个系统时钟不是很简单吗&#xff1f;为…

进程间通信方式---System V IPC信号量

进程间通信方式—System V IPC信号量 文章目录 进程间通信方式---System V IPC信号量信号量1.信号量原语2.semget 系统调用参数返回值 3.semop 系统调用参数返回值 4.semctl 系统调用5.特殊键值 IPC_PRIVATE6.信号量实现进程间通信1. 数据结构定义2. 信号量操作相关部分3. 生产…

深入理解Kafka:核心设计与实践原理读书笔记

目录 初识Kafka基本概念安装与配置ZooKeeper安装与配置Kafka的安装与配置 生产与消费服务端参数配置 生产者客户端开发消息对象 ProducerRecord必要的参数配置发送消息序列化分区器生产者拦截器 原理分析整体架构元数据的更新 重要的生产者参数acksmax.request.sizeretries和re…

electron 顶部的元素点不中,点击事件不生效

electron 顶部的元素点不中&#xff0c;点击事件不生效

Excel设置生日自动智能提醒,公式可直接套用!

大家好&#xff0c;我是小鱼。 今天跟大家分享一个WPS表格中根据出生日期&#xff0c;设置生日提醒&#xff0c;并且根据距离生日天数自动标记数据颜色。简单又实用&#xff0c;一个公式轻松搞定&#xff01; 接下来我们先学习一下需要使用到的函数&#xff0c;然后再根据实例让…

全域数据集成平台ETL

全域数据集成平台ETL Restcloud 工作原理 RestCloud数据集成平台采用SpringCloud微服务架构技术开发&#xff0c;底层基于纯Java语言采用前后端分离架构&#xff0c;前端采用React技术进行开发。 RestCloud数据集成平台是基于数据流工作流引擎的架构进行研发的&#xff0c;底…