当前位置: 首页 > 面试题库 >

SQL运行减法

敖和韵
2023-03-14
问题内容

我有一个结果集如下:

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


 类似资料:
  • 我在熊猫数据框上有一个时间序列,它与月份成一行。我打电话给df1。然后我得到组的月平均值,我把df2称为结果数据帧。现在我想减去每个列的月平均值,而不使用循环。也就是说,需要从df1中“月”==1的所有行中减去df2中的行“月==1”。 在numpy中,我将重塑矩阵,执行操作(由于numpy广播),然后再次重塑矩阵。但我不知道什么是泛张力的方法。尽管我觉得这应该是一个非常简单的方法。 这里有一个例

  • 问题内容: 我已经迷上了一些SQL,其中有几行数据,我想从上一行中减去一行,并使其一直向下重复。 所以这是表格: 我希望结果显示第三列,称为差异,即从下面的一列减去第一行,最后一行从零减去。 我已经尝试过自我连接,但是我不确定如何限制结果,而不是让结果不断循环。我不能确定id值对于给定的结果集是连续的,所以我不使用该值。我可以扩展架构以包括某种顺序值。 这是我尝试过的: 谢谢您的协助。 问题答案:

  • 问题内容: 同时支持MySQL和SQL Server我需要从日期中减去几天。可以使用ANSI SQL完成此操作,还是需要维护两个版本? 例如。我有这个用于MySQL: 问题答案: ANSI SQL 2003规范没有公开可用的版本,但是没有厂商完全支持它。无论如何,这两者之间的语法有足够的差异,可以为每个编写不同的代码。 MySQL具有以下功能: SQL Server具有一个功能(不带下划线): 同

  • 我正在做一个项目,我有两个线程一起运行。这个项目是一个模拟银行,本质上,我们有一个存款线程和一个取款线程。我有一个存款线程经常运行的问题,导致银行账户的余额上升。(我希望现实生活中也有这个问题。)如何减少一个线程运行的时间? 这是我的主要课程: 以下是取款和存款线程类: 最后她是交易类: 我试图让线程在达到锁定条件之前进入睡眠状态,但不幸的是,它不起作用。

  • 问题内容: 我在mySQL中有一个带有以下各列的表: TRANS_TYPE可以是“ DRINV”(销售)或“ DRCDT”(信用)。 我想获取每个客户的总销售额,因此到目前为止,我的查询是: 问题是这是销售 和 积分的总和,而不是销售减去积分。我希望结果是 是否可以在SQL查询中执行此操作? 问题答案:

  • 问题内容: 我有一张桌子,上面有日期和交易记录。我需要计算运行总计(用总和划分很容易),除了当“金额”中存在负值时需要将其重置为零,然后再次开始计算运行总计。有任何想法吗? 问题答案: 使用更新变量方法,您可以使用重置选项计算运行总计。