如何对Service-Based Database表中列求和并写入同表另一列
问题描述
我是编程新手,已创建Service-Based Database用于存储数据,现有一张gametable表,结构及数据如下:
| gameprice | gamedesc | gametotal |
|---|---|---|
| 60 | RDR2 | |
| 40 | R6S |
我需要将gameprice列的数值求和后写入gametotal列,且当新增游戏数据时,该总和能自动更新。目前我尝试了SQL语句:
Select Sum(gameprice) as gametotal From gametable
期望达到如下效果:
新增数据前:
| gameprice | gamedesc | gametotal |
|---|---|---|
| 60 | RDR2 | 100 |
| 40 | R6S |
新增一条gameprice=60,gamedesc=DyingL2的数据后:
| gameprice | gamedesc | gametotal |
|---|---|---|
| 60 | RDR2 | 160 |
| 40 | R6S | |
| 60 | DyingL2 |
解决方案
针对你的需求,在SQL Server(Service-Based Database一般指SQL Server本地数据库)中,有两种常用方法实现自动维护总和:
方法1:使用计算列(推荐)
如果希望gametotal列自动计算且无需手动维护,可以创建基于标量函数的计算列,每次数据变更时自动更新总和:
- 创建计算总和的标量函数:
CREATE FUNCTION dbo.GetTotalGamePrice() RETURNS INT AS BEGIN RETURN (SELECT SUM(gameprice) FROM gametable) END
- 修改表结构添加计算列(若
gametotal已存在,先删除再添加):
-- 若gametotal列已存在,执行删除 ALTER TABLE gametable DROP COLUMN gametotal; -- 添加自动计算总和的列 ALTER TABLE gametable ADD gametotal AS dbo.GetTotalGamePrice();
此后查询表时,gametotal列会自动显示当前gameprice的总和,新增/删除/修改数据时会实时更新。
方法2:使用触发器
如果仅需要在特定行存储总和,可通过触发器实现数据变更时自动更新指定行的总和:
- 创建
INSERT触发器:
CREATE TRIGGER trg_UpdateGameTotal ON gametable AFTER INSERT AS BEGIN DECLARE @total INT; SELECT @total = SUM(gameprice) FROM gametable; -- 更新指定行的gametotal,这里以gamedesc='RDR2'为例,可按需调整 UPDATE gametable SET gametotal = @total WHERE gamedesc = 'RDR2'; END
- 初始化当前总和:
DECLARE @initialTotal INT; SELECT @initialTotal = SUM(gameprice) FROM gametable; UPDATE gametable SET gametotal = @initialTotal WHERE gamedesc = 'RDR2';
此后每次新增数据,触发器会自动计算总和并更新指定行的gametotal。
额外建议
如果仅需查询时展示总和,无需将总和存储在表中,直接使用以下查询即可,避免数据冗余:
SELECT gameprice, gamedesc, CASE WHEN gamedesc = 'RDR2' THEN (SELECT SUM(gameprice) FROM gametable) ELSE '' END AS gametotal FROM gametable;
内容的提问来源于stack exchange,提问作者user19541730
相关产品推荐
相关产品推荐

