SQL运行减法

2023-11-29

我的结果集如下:

Item    ExpectedQty  ReceivedQty  Short
Item01  30           45           5
Item01  20           45           5

Item02  40           38           2

item03  50           90           10
item03  30           90           10
item03  20           90           10

查询是:

select a.Item, a.ExpectedQty,b.ReceivedQty, b.Short
from a join b on a.Item = b.Item

我需要得到第二张图表中的结果。基本上,我每行都有收到的总数量,我需要根据预期数量显示收到的数量,如果有任何短缺,我需要在最后一行显示。

预期的:

Item    ExpectedQty  ReceivedQty  Short
item01  30           30           0
item01  20           15           5

item02  40           38           2

item03  50           50           0
item03  30           30           0
item03  20           10           10

提前致谢。

编辑, 第 02 版;

--    Just a brief of business scenario is table has been created for a good receipt. 
--    So here we have good expected line with PurchaseOrder(PO) in first few line. 
--    And then we receive each expected line physically and that time these 
--    quantity may be different 
--    due to business case like quantity may damage and short quantity like that. 
--    So we maintain a status for that eg: OK, Damage, also we have to calculate
--    short quantity 
--    based on total of expected quantity of each item and total of received line.


if object_id('DEV..Temp','U') is not null
drop table Temp

CREATE TABLE Temp 
(        
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,        
Item VARCHAR(32),
PO VARCHAR(32) NULL,        
ExpectedQty INT NULL,
ReceivedQty INT NULL,
[STATUS] VARCHAR(32) NULL,
BoxName VARCHAR(32) NULL
)


--  Please see first few line with PO data will be the expected lines, 
--  and then rest line will be received line

INSERT INTO TEMP (Item,PO,ExpectedQty,ReceivedQty,[STATUS],BoxName)
SELECT 'ITEM01','PO-01','30',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM01','PO-02','20',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM02','PO-01','40',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM03','PO-01','50',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM03','PO-02','30',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM03','PO-03','20',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM04','PO-01','30',NULL,NULL,NULL UNION ALL 
SELECT 'ITEM01',NULL,NULL,'20','OK','box01' UNION ALL 
SELECT 'ITEM01',NULL,NULL,'25','OK','box02' UNION ALL 
SELECT 'ITEM01',NULL,NULL,'5','DAMAGE','box03' UNION ALL 
SELECT 'ITEM02',NULL,NULL,'38','OK','box04' UNION ALL 
SELECT 'ITEM02',NULL,NULL,'2','DAMAGE','box05' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'30','OK','box06' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'30','OK','box07' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'30','OK','box08' UNION ALL 
SELECT 'ITEM03',NULL,NULL,'10','DAMAGE','box09' UNION ALL
SELECT 'ITEM04',NULL,NULL,'25','OK','box10' 



--  Below Table is my expected result based on above data. 
--  I need to show those data following way. 
--  So I appreciate if you can give me an appropriate query for it. 
--  Note: first row is blank and it is actually my table header. :) 

SELECT  ''as'ITEM', ''as'PO#', ''as'ExpectedQty',''as'ReceivedQty',
''as'DamageQty' ,''as'ShortQty' UNION ALL 

SELECT 'ITEM01','PO-01','30','30','0' ,'0'  UNION ALL 
SELECT 'ITEM01','PO-02','20','15','5' ,'0'  UNION ALL 
SELECT 'ITEM02','PO-01','40','38','2' ,'0'  UNION ALL 
SELECT 'ITEM03','PO-01','50','50','0' ,'0'  UNION ALL 
SELECT 'ITEM03','PO-02','30','30','0' ,'0'  UNION ALL 
SELECT 'ITEM03','PO-03','20','10','10','0' UNION ALL 
SELECT 'ITEM04','PO-01','30','25','0' ,'5'  

问题的一部分是获取预期项目数量的运行总计。为此,您需要一种方法来区分具有相同项目的行,以及卸载相同项目数量的顺序的规则。

为了尝试解决您的问题,我将假设有一个时间戳列,其值提供放电顺序并且在同一项目组中是唯一的。

这是我正在测试我的解决方案的示例数据定义:

CREATE TABLE TableA (Item varchar(50), ExpectedQty int, Timestamp int);
INSERT INTO TableA
SELECT 'Item01', 30, 1 UNION ALL
SELECT 'Item01', 20, 2 UNION ALL
SELECT 'Item02', 40, 1 UNION ALL
SELECT 'item03', 50, 1 UNION ALL
SELECT 'item03', 30, 2 UNION ALL
SELECT 'item03', 20, 3;

CREATE TABLE TableB (Item varchar(50), ReceivedQty int);
INSERT INTO TableB
SELECT 'Item01', 45 UNION ALL
SELECT 'Item02', 38 UNION ALL
SELECT 'item03', 90;

这是我的解决方案:

SELECT
  Item,
  ExpectedQty,
  ReceivedQty = CASE
    WHEN RemainderQty >= 0 THEN ExpectedQty
    WHEN RemainderQty < -ExpectedQty THEN 0
    ELSE RemainderQty + ExpectedQty
  END,
  Short = CASE
    WHEN RemainderQty >= 0 THEN 0
    WHEN RemainderQty < -ExpectedQty THEN ExpectedQty
    ELSE ABS(RemainderQty)
  END
FROM (
  SELECT
    a.Item,
    a.ExpectedQty,
    RemainderQty = b.ReceivedQty - a.RunningTotalQty
  FROM (
    SELECT
      a.Item,
      a.Timestamp,
      a.ExpectedQty,
      RunningTotalQty = SUM(a2.ExpectedQty)
    FROM TableA a
      INNER JOIN TableA a AS a2 ON a.Item = a2.Item AND a.Timestamp >= a2.Timestamp
    GROUP BY
      a.Item,
      a.Timestamp,
      a.ExpectedQty
  ) a
    INNER JOIN TableB b ON a.Item = b.Item
) s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL运行减法 的相关文章

随机推荐

  • 在生产环境中,Socket.io websocket 在 Nuxt 3 中无法工作

    我正在 Nuxt 3 应用程序中创建一个 socket io 实现 当我处于开发模式时 Websocket 可以工作 但出现此错误错误信息 我使用的是 Nuxt 版本 nuxt v3 0 0 rc 8 这是我的 nuxt config ts
  • 将数据从一个表插入到另一个表

    我有两个不同的表 但列的命名略有不同 我想从一张表中获取信息并将其放入另一张表中 仅当表 1 中的 信息字段 不为空时 我才需要将表 1 中的信息放入表 2 中 每当创建某些内容时 表 2 都有一个唯一的 ID 因此插入的任何内容都需要获取
  • 使用单连接实例实现 Eclipse MQTT Android 客户端

    我在我的应用程序中使用 Eclipse Paho android mqtt 服务 我能够订阅消息并将消息发布到 mqtt 代理 我的应用程序中有几个活动 当任何活动启动时 它都会使用以下方式连接到代理mqttAndroidClient co
  • PowerShell:.NET 程序集的导入模块或添加类型?

    我使用的是 PowerShell 5 1 Windows 10 x64 我应该使用这 2 个 cmdlet 中的哪一个将 NET 程序集 特别是 NET Framework 4 程序集 加载到 PowerShell 中 他们之间的核心区别是
  • 如何使用 VBScript 或批处理文件下载 JSON 文件并获取值?

    这是回答的 VBScript 代码here从计算机获取具有正确值的 JSON 文件 Set fso CreateObject Scripting FileSystemObject json fso OpenTextFile C path t
  • 温莎城堡:- 通过配置注入接口字典

    您好 我正在尝试注入接口字典 但从城堡中收到如下错误 Castle MicroKernel SubSystems Conversion ConverterException 没有注册转换器来处理 IFoo 类型 为了解决该异常 我必须创建一
  • 如何获得 url 更改的提示

    我是 gwt 的新人 我希望当用户按下后退按钮时 他会收到一个警报 表明我们将刷新页面 大多数情况下 我们会在松散焦点打字时看到 如果用户按下后退按钮 他的页面就会刷新 并且所有值都会被清洗 我们怎样才能做到这一点 Try 窗口 Closi
  • Spring Cloud Config:客户端不会尝试连接到配置服务器

    我正在尝试创建一个简单的 Spring Cloud Config 服务器 客户端设置 并且大致遵循文档 https cloud spring io spring cloud config reference html 到目前为止 我已经实现
  • HTML 5 中的视频捕获

    如何从视频设备捕获视频并使该视频在 HTML5 画布中可用 也许你应该使用HTML5视频捕捉功能 这种方式不需要安装任何插件 而是告诉用户升级他们的浏览器
  • Summernote - 从服务器删除图像

    您好 我已使用以下链接中的代码来允许将图像上传到服务器 Summernote 图片上传 如果用户从编辑器中删除图像 是否可以实现类似的操作以从服务器中删除图像 如果是这样 我该如何实现这一目标 要从服务器删除文件 您需要使用onMediaD
  • jTable 根据数据所有者条件显示\隐藏编辑和删除按钮

    我使用 jTable 来显示 CD 信息 并使用子表来显示该 CD 的评论 我希望能够仅在登录用户的行上显示编辑 删除按钮 我一直在尝试遵循以下建议 https github com hikalkan jtable issues 113 h
  • Method Of类型不能用来调用该方法

    我想动态生成一些测试 因为我必须调用一个带有要调用的方法名称的方法 然后完成所有测试设置并调用该方法 所以基本上我打电话createTest methodName 代替it methodName gt lotsOfBoringStuff 为
  • RestKit 0.20.1 如何映射父id

    给定这个 XML 负载
  • 反序列化递归 JSON 对象 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个像这样的递归 JSON 对象 表示查询表达式 where operator AND left operator fieldRef requestor value me r
  • 亚马逊在 R 中评论网络抓取:当其中一条评论来自另一个国家时,如何避免遇到错误?

    为了获得一些有趣的 NLP 数据 我刚刚开始在 R 中进行一些基本的网络抓取 我的目标是尽可能多地从亚马逊收集产品评论 我的第一次基本试验成功了 但现在遇到了错误 您可以从我的 reprex 中的网址查看 该产品有 3 页评论 如果我刮掉第
  • 切片 numpy 数组时出现意外的形状

    我有一个 4D numpy 数组 在单个维度中对多个索引进行切片时 我的轴会互换 我在这里错过了一些微不足道的事情吗 import numpy as np from smartprint import smartprint as print
  • 评估复杂的时间模式

    我想定义和评估一些非常复杂的时间模式的出现 这些模式无法通过 CRON 表达式轻松处理 有没有图书馆可以帮助我做到这一点 例如 我希望它每 25 秒发生一次 我只想发生在每月的第一天和最后一天 但每月的第一天应该让我在上午 9 00 到 1
  • 在 GLSurfaceView 而不是 SurfaceView 中播放视频

    我已经为此苦苦挣扎了两天了 按照这个答案 https stackoverflow com a 2006454 444324 提到可以通过更改 API 演示中的 MediaPlayerDemo Video 示例来在 GLSurfaceView
  • 未找到 Java 命令

    我正在尝试让 java 命令在我的计算机上运行 每当我尝试使用它时 都会收到错误 java 未被识别为内部或 我做了什么到目前为止 我已经通过系统环境变量追踪了这个问题 该变量有一个链接到 C ProgramData Oracle Java
  • SQL运行减法

    我的结果集如下 Item ExpectedQty ReceivedQty Short Item01 30 45 5 Item01 20 45 5 Item02 40 38 2 item03 50 90 10 item03 30 90 10