Sql server 使用“按函数划分”为每个插入的值添加一个运行总计列
如果你对这个问题有更好的标题,请让我知道。感谢您提前查看 表I在插入后需要更新总计列Sql server 使用“按函数划分”为每个插入的值添加一个运行总计列,sql-server,Sql Server,如果你对这个问题有更好的标题,请让我知道。感谢您提前查看 表I在插入后需要更新总计列 FK_Key Score Total ---------------------- 121 1 NULL 121 5 NULL 121 7 NULL 我想做的是通过查看分数值来更新Total列: FK_Key Score Total ----------------------- 121 1 1 1
FK_Key Score Total
----------------------
121 1 NULL
121 5 NULL
121 7 NULL
我想做的是通过查看分数值来更新Total
列:
FK_Key Score Total
-----------------------
121 1 1
121 5 6
121 7 13
假设为表中的同一外键插入了新行:
121 6 19
每次发生新的插入时,它都应该更新汇总由FK分组的得分
列中的值的总计
列-此处得分
为19,即(1+5+7+6)
基本上,我正在寻找一个update语句,该语句查看Score列并更新每个FK的值。我不希望在所有FK中更新相同的值
下面是要处理的查询
IF OBJECT_ID('tempdb..#Table1') IS NOT NULL
DROP TABLE #Table1
GO
CREATE TABLE #Table1
(
FK_Key INT,
Score INT NULL,
Total INT NULL,
)
INSERT INTO #Table1
VALUES (121, 1, NULL), (121, 5, NULL), (121, 7, NULL), (121, 6, NULL)
SELECT * FROM #Table1
预期结果
如我在评论中所述,我的建议是更改表结构,使其包含“时间戳”类型的列,以便您知道何时插入了数据,否则,无法保证每次运行查询时都返回完全相同的记录集,然后创建一个视图以获取所需的数据 您的解决方案如下所示:
CREATE TABLE #Table1
(
FK_Key INT
,Score INT NULL
,InsertTime DATETIME2 DEFAULT GETDATE()
)
INSERT INTO
#Table1 (FK_Key, Score)
VALUES
(121, 1), (121, 5), (121, 7), (121, 6)
SELECT
FK_Key
,Score
-- ,InsertTime
,SUM(Score) OVER (PARTITION BY FK_Key ORDER BY InsertTime ROWS UNBOUNDED PRECEDING) AS Total
FROM
#Table1
显然,最后一个查询可以存储为视图
这将允许一致的结果,还可以处理删除行后会扰乱当前运行的总体逻辑的情况
希望这是有意义的/有帮助的。一个想法-您是否可以添加一个额外的时间戳列,然后通过视图而不是插入计算来执行您希望执行的操作?似乎这将是一个更好的结构/允许删除等。如果我添加一个标识列而不是时间戳会怎么样。这些数据是由SSIS包插入的,因此是批量插入。如果数据以块的形式插入,时间戳对我没有帮助。任何具有唯一增量值的列都可以工作,因此
Identity
就可以了。您对问题标题有什么建议吗?它可能会帮助其他人可能会“添加一个正在运行的总计列”或类似的内容。。。如果答案对你有效,不要忘记接受,这样人们就会知道你的问题已经解决了。