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

ops/2024/12/22 18:00:25/

目录

0 需求描述

1 数据准备

 2 问题分析

3 小结

累计到货数量计算

出货数量计算

剩余数量计算


0 需求描述

假设现有多种商品的订单需求表 DEMO_REQUIREMENT,以及商品的到货队列表 DEMO_ARR_QUEUE,要求按照业务需要,设计一个报表,展示出每种商品的到货队列,并给出每次到货应直接出货多少数量,出货后剩余多少数量,直到某批到货满足订单需求则不再统计该商品的出货计划。

1 数据准备

sql">-- 创建商品需求表并插入示例数据
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:每个商品每次到货的累计到货数量及对应需求数量

sql">-- 计算每个商品每次到货时累计到货数量以及对应需求数量(通过连接获取),作为中间结果展示
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_idarr_idarr_qtycumulative_arrival_qtyreq_qty
110606060
1115011060
2124040100
21360100100
314202080
315507080
3165012080
417404090
418408090

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

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

sql">-- 基于前面的中间结果进一步计算出货量和剩余量,展示最终结果
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_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)进行排序,确保累计计算是按照到货的先后顺序进行的。例如:

sql">SUM(arr_qty) OVER (PARTITION BY item_id ORDER BY arr_id) AS cumulative_arrival_qty
  • 这个表达式会为每个商品的每一行数据计算出从第一行到当前行的到货数量总和,也就是累计到货数量。

出货数量计算

条件判断逻辑

首先进行一个主要的条件判断,即比较当前商品的累计到货数量(cumulative_arrival_qty)与订单需求数量(req_qty)的大小关系。使用 CASE WHEN 语句来实现:

sql">CASEWHEN cumulative_arrival_qty <= req_qty
  • 如果累计到货数量小于等于订单需求数量,说明还未完全满足订单或者刚好满足订单。此时,出货数量的计算需要进一步考虑当前到货数量(arr_qty)和订单需求剩余数量。订单需求剩余数量可以通过订单需求数量减去之前已经累计到货但未出货的数量得到,即 req_qty - (cumulative_arrival_qty - arr_qty)。然后使用 LEAST 函数取当前到货数量和订单需求剩余数量中的较小值作为出货数量:
sql">THEN LEAST(arr_qty, req_qty - (cumulative_arrival_qty - arr_qty))
  • 如果累计到货数量大于订单需求数量,说明订单已经满足,此时出货数量为 0:
sql">ELSE 0
END AS shipment_quantity

剩余数量计算

分情况处理

同样使用 CASE WHEN 语句来处理不同情况。

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

sql">CASEWHEN cumulative_arrival_qty < req_qtyTHEN req_qty - cumulative_arrival_qty
  • 当累计到货数量等于订单需求数量时,剩余数量为 0:
sql">    WHEN cumulative_arrival_qty = req_qtyTHEN 0
  • 当累计到货数量大于订单需求数量时,剩余数量为累计到货数量减去订单需求数量:
sql">    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.ppmy.cn/ops/144085.html

相关文章

MFC/C++学习系列之简单记录6

MFC/C学习系列之简单记录6 前言CAboutDlg和CMFCtest1Dlg的区别MSFlexGrid的限制输入其他方式 CWndCDC总结 前言 简单的记录一下&#xff01; CAboutDlg和CMFCtest1Dlg的区别 在使用添加事件后&#xff0c;出现两者&#xff0c;并且在CAboutDlg中无法使用已经定义的控件&#x…

算法 计算大的长方形容器中,存放一排小长形容器,计算出小长形容器中最后一个元素的x坐标的位置的实现方法

1、先上个图&#xff1a; 2、说明 1&#xff09;中间的蓝色长方形是里面的橙色长方形的容器&#xff0c;比如第一个图中width2width3&#xff0c;因为只有一个&#xff0c;第二个图中有二个小的长方形&#xff0c;也就是说width22width3&#xff0c;第三个图中有3个小长方形&a…

DA-CLIP:Controlling Vision-Language Models for Universal Image Restoration

conference&#xff1a;2024 ICLR paper&#xff1a;https://arxiv.org/pdf/2310.01018 code&#xff1a;https://github.com/Algolzw/daclip-uir 文章目录 作者动机核心思想常见解决方案挑战本文解决方法 贡献方法基本框架Controller的优化与Loss函数数据对的生成基本框架数据…

GPT人工智能在医疗文档中的应用

应用场景 用于文档的整理。主要是针对医疗方面的文档整理。病人在打官司或者办理其他业务时&#xff0c;需要把很多文档整理成册并添加目录、编写概要&#xff08;Summary&#xff09;。这些文档有电子版本的&#xff0c;有纸质的扫描件&#xff0c;还有拍照&#xff08;一般是…

Android -- 双屏异显之方法一

Android – 双屏异显之方法一&#xff1a;MediaRouter PS: 1. 部分主板可能不支持&#xff0c;得验证&#xff1b; 2. 副屏输出可以不用连接显示屏也能正常后台运行&#xff1b; 3. 主屏Activity内控制副屏&#xff1b; 4. 副屏截图命令&#xff1a;screencap -p -d 1 <pat…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

vitepress-打包SyntaxError: Element is missing end tag.

一、vitepress打包编译报错Element is missing end tag. 背景&#xff1a; 新增了一些笔记准备上传到git仓库&#xff0c;持续集成部署的时候&#xff0c;控制台报错了&#xff0c;错误信息如下&#xff1a; SyntaxError: Element is missing end tag. 仔细看了下控制台几乎没啥…

【Verilog】实验八 有限状态机设计

一、实验目的 1. 掌握有限状态机原理和设计方法。 2. 掌握ModelSim和VIVADO工具软件。 3. 掌握基本的测试代码编写和FPGA开发板使用方法。 二、实验环境 1. 装有ModelSim和VIVADO的计算机。 2. Sword实验系统。 三、实验原理 有限状态机是时序电路的通用模型&#xff0…