SQL 服务器更新查询以添加总计
SQL server update query to add totals
我有一个 table 如下:
第一条记录Amount和TotalAmount相同
在第二条记录中,从第一行和当前行添加金额,并添加总金额
等等....
现在,如果我将第二行从 1.25 更新为 2,则所有后续记录的 TotalAmount 都应更改。
我需要一个更新查询。
我有 seq_no 和行号作为参考,字段类型是参考
如果您可以使用行号作为参考,那么您可以尝试以下查询,但如评论中所述,将总计存储在 table 中是个坏主意:
DECLARE @Temp TABLE
(
Amount float,
TotalAmount float,
Rownum int
)
INSERT INTO @Temp VALUES (1.25,1.25,1),(1.25,2.50,2),(10,12.50,3)
DECLARE @PreviousAmount AS FLOAT
SELECT @PreviousAmount = Amount FROM @Temp WHERE Rownum=1
DECLARE @NewAmount AS FLOAT = 2
UPDATE @Temp SET TotalAmount = TotalAmount - @PreviousAmount WHERE Rownum>=1
UPDATE @Temp SET Amount=@NewAmount, TotalAmount = TotalAmount + @NewAmount WHERE Rownum=1
UPDATE @Temp SET TotalAmount = TotalAmount + @NewAmount WHERE Rownum>1
SELECT * FROM @Temp
理想情况下,您应该创建一个执行 运行 总计的视图或存储过程,这是使用子查询的一种方法的示例:
SELECT
Type,
Amount ,
Total =
(
SELECT SUM(Amount)
FROM SomeTable B
WHERE B.Type=A.Type AND B.RowNum <= A.RowNum
)
FROM SomeTable A
这只是一种方法(不一定是最好的)。我建议您 google 'Running totals in SQL' 并熟悉此方法和其他方法的解释,它们各自的优缺点和性能影响。
一个问题,您使用的 SQL 服务器是什么版本?
如果你想使用触发器(不推荐),你可以使用这个:
create trigger trigger_name
for update
as
declare @count int= (select count(*) from table)
declare @a int =1
while(@a<@count)
begin
update table
set total_amount=(select amount from table where row_number=@a) + (select amount from table where row_number=@a-1 )
where row_number!=1
set @a=@a+1
end
Go
我有一个 table 如下:
第一条记录Amount和TotalAmount相同
在第二条记录中,从第一行和当前行添加金额,并添加总金额
等等....
现在,如果我将第二行从 1.25 更新为 2,则所有后续记录的 TotalAmount 都应更改。
我需要一个更新查询。
我有 seq_no 和行号作为参考,字段类型是参考
如果您可以使用行号作为参考,那么您可以尝试以下查询,但如评论中所述,将总计存储在 table 中是个坏主意:
DECLARE @Temp TABLE
(
Amount float,
TotalAmount float,
Rownum int
)
INSERT INTO @Temp VALUES (1.25,1.25,1),(1.25,2.50,2),(10,12.50,3)
DECLARE @PreviousAmount AS FLOAT
SELECT @PreviousAmount = Amount FROM @Temp WHERE Rownum=1
DECLARE @NewAmount AS FLOAT = 2
UPDATE @Temp SET TotalAmount = TotalAmount - @PreviousAmount WHERE Rownum>=1
UPDATE @Temp SET Amount=@NewAmount, TotalAmount = TotalAmount + @NewAmount WHERE Rownum=1
UPDATE @Temp SET TotalAmount = TotalAmount + @NewAmount WHERE Rownum>1
SELECT * FROM @Temp
理想情况下,您应该创建一个执行 运行 总计的视图或存储过程,这是使用子查询的一种方法的示例:
SELECT
Type,
Amount ,
Total =
(
SELECT SUM(Amount)
FROM SomeTable B
WHERE B.Type=A.Type AND B.RowNum <= A.RowNum
)
FROM SomeTable A
这只是一种方法(不一定是最好的)。我建议您 google 'Running totals in SQL' 并熟悉此方法和其他方法的解释,它们各自的优缺点和性能影响。 一个问题,您使用的 SQL 服务器是什么版本?
如果你想使用触发器(不推荐),你可以使用这个:
create trigger trigger_name
for update
as
declare @count int= (select count(*) from table)
declare @a int =1
while(@a<@count)
begin
update table
set total_amount=(select amount from table where row_number=@a) + (select amount from table where row_number=@a-1 )
where row_number!=1
set @a=@a+1
end
Go