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

SQL Update表的累积值

殳飞扬
2023-03-14
问题内容

我有这张桌子:

Date  |StockCode|DaysMovement|OnHand
29-Jul|SC123    |30          |500
28-Jul|SC123    |15          |NULL
27-Jul|SC123    |0           |NULL
26-Jul|SC123    |4           |NULL
25-Jul|SC123    |-2          |NULL
24-Jul|SC123    |0           |NULL

仅第一行具有OnHand值的原因是因为我可以从另一个存储任何股票代码的当前数量的表中获得该值。

该表中的其他记录取自另一个表,该表记录了给定日期的所有移动。

我想更新上表,以便OnHand列基于上一条记录的存量和移动显示该行日期的QtyOnHand,这样在更新结束时看起来像这样:

Date  |StockCode|DaysMovement|OnHand
29-Jul|SC123    |30          |500
28-Jul|SC123    |15          |470
27-Jul|SC123    |0           |455
26-Jul|SC123    |4           |455
25-Jul|SC123    |-2          |451
24-Jul|SC123    |0           |453

我目前正在使用CURSOR实现这一目标。但是性能确实吸引了成千上万的记录。

我可以运行一些基于SET的UPDATE语句来实现相同的结果吗?


问题答案:

试试这个( 小提琴演示

DECLARE @Movement INT , @OnHandRunning INT

;WITH CTE AS
(
    SELECT TOP 100 percent DaysMovement, OnHand 
    FROM Table1
    ORDER BY [StockCode], [Date] DESC
)
UPDATE CTE SET @OnHandRunning = OnHand = COALESCE(@OnHandRunning - @Movement, OnHand),
               @Movement = DaysMovement

更新: 对于多个StockCodes查询,您可以修改上面的查询,如下所示(
Fiddle演示2 ):

DECLARE @Movement INT , @OnHandRunning INT, @StockCode VARCHAR(10) = ''

;WITH CTE AS
(
    SELECT TOP 100 percent DaysMovement, OnHand, StockCode  
    FROM Table1
    ORDER BY [StockCode],[Date] DESC
)
UPDATE CTE SET @OnHandRunning = OnHand = 
       CASE WHEN @StockCode<> StockCode THEN OnHand ELSE @OnHandRunning - @Movement END,
       @Movement = DaysMovement,
       @StockCode = StockCode


 类似资料:
  • 问题内容: 我已经实现了一定数量的所有素数的列表。我试图做的事情很难解释,所以我只用一些硬代码展示一下: 所以从本质上讲,我试图从上一个列表中按顺序取出一个元素,然后按指数倍增,然后将其追加到其他列表中。 我意识到我可以做到这一点,这可能会更容易: 我需要一些想法才能在某种程度上做到这一点。 问题答案: 您需要 累积产品 清单。这是一个简单的食谱: 另一种方法,使用itertools: 或者,也许

  • 我想知道为什么需要(又名reduce)第3个参数。对于那些不知道是什么的人,它的用法如下: 调用等同于: 还有可选第4个参数,它允许用任何其他操作替换加法。 我听说的一个基本原理是,如果你不需要加起来,而是乘一个向量的元素,我们需要其他的(非零)初始值: 但是为什么不像Python那样-为设置初始值,并使用从开始的范围。类似这样的事情: 这对任何行动都管用。为什么需要第三个参数?

  • 我正在编写一个使用NIO套接字的Java应用程序。它由3台服务器和一组客户端组成。客户端可以与服务器通信,服务器可以与客户端和其他服务器通信。 服务器到服务器和客户端到服务器发送序列化为< code>byte[]数组的< code >消息。每个< code >消息的第一个字节包含消息的大小,自然保证每个消息不包含超过< code>127 (2^8 -1)字节。您可以将服务器和客户端的消息发送视为循

  • org.springframework.jdbc.object.SqlUpdate类提供表示SQL更新的可重用操作对象。 Class 声明 (Class Declaration) 以下是org.springframework.jdbc.object.SqlUpdate类的声明 - public abstract class SqlUpdate<T> extends SqlOperation

  • org.springframework.jdbc.object.SqlUpdate类提供表示SQL更新的可重用操作对象。 Class 声明 (Class Declaration) 以下是org.springframework.jdbc.object.SqlUpdate类的声明 - public abstract class SqlUpdate<T> extends SqlOperation

  • sqlupdate 读取 MySQL 的表定义 SQL 文件,然后与现有数据库中进行比较,然后生成更新数据库结构的 SQL 语句。 sqlupdate v1.6.5 - Copyright (C) Joel Yliluoma (http://iki.fi/bisqwit/)Usage: sqlupdate [options] >changes.sql (Creates an up