使用 Sybase ASA11 的案例语句更新记录

Update record with case statement for Sybase ASA11

我正在使用 sybase ASA11。有 2 table、存款 table(列 = 余额、AccountXID)和 Trx Table(列 = TimeRqTimestamp、trxresp)。

我有这样的更新语法

--Update for table Deposit  
    @Amount = 2000
    @Accountxid = 123    
    
    update Deposit set Balance = Balance - @Amount where AccountXID = @AccountXID;

如果 SELECT 语法中有一条或更多条记录,那将 运行 table Trx :

--Select for table Trx 
    select * from Trx  where  TimeRqTimestamp > DATEADD(HOUR, -1, GETDATE()) 
    and trxresp in (51,55)

我将为数据库中每隔一小时 运行 的事件制作此脚本。

如果我运行这个SELECT语法并且有一条记录,那么余额将更新一次,accountxid 123的金额为2000,然后有2条记录余额将更新一次 AGAIN,accountxid 123 的金额为 2000。如果有 3 条或更多记录,它将再次更新。这取决于在那个时间 运行 事件显示的记录数。

示例 = table 存款 20.000 时帐户 XID 123 中的余额。然后事件运行,在事件运行的最后一小时内table Trx中有4条记录,这意味着从20.000更新4次(20.000 - 2.000 - 2.0000 - 2.000 - 2.000 = 12.000 ) 所以,现在记录余额 12.000

我想要的输出是 table 存款将根据 table Trx 中 select 的每次事件 运行 的记录进行更新。 Tabletrx显示1条记录,Tableupdate会更新一次,Tabletrx显示2条记录,tabledeposit会更新两次

(抱歉英文不好)

已编辑:

我尝试根据所需的输出制作脚本,在这种情况下,我使用来自 table Trx 的每条记录的计数 (*),我不知道结果是否正确.结果是这样的:

begin
    declare @ctrx int;
    declare @Amount = 2000;
    declare @Accountxid = 123;
    
    set @ctrx = (select count(*) from Trx   
                    where 
                    TimeRqTimestamp > DATEADD(HOUR, -1, GETDATE())
                    and trxresp in (51,55);
                    
    update Deposit set Balance = Balance - (@Amount * @ctrx) where AccountXID = @AccountXID;
end;

你应该清楚地解释你想要的输出,关于你提到的 table 的信息(例如它的列、记录等),而不是用示例参数解释你的查询。

您可以查看下面的更新代码,该代码根据 Trx 的记录更新 table Deposit。可以使用COUNT聚合函数统计记录金额,然后更新余额。

@Amount = 2000
@Accountxid = 123

WITH Account_Deposit (AccountXID, Balance)
AS
(
SELECT
    AccountXID,
    COUNT(*) AS Record_Amount
FROM
    Trx
GROUP BY
    AccountXID
)
UPDATE
    Deposit
SET
    Balance = Balance - (Account_Deposit.Record_amount*@Amount)
FROM
    Deposit
INNER JOIN
    Account_Deposit
ON
    Deposit.AccountXID = Account_Deposit.AccountXID

如果您只想更新帐户 ID“123”,请在下面添加您的子句

WHERE AccountXID = @AccountXID