Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用“按函数划分”为每个插入的值添加一个运行总计列_Sql Server - Fatal编程技术网

Sql server 使用“按函数划分”为每个插入的值添加一个运行总计列

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

如果你对这个问题有更好的标题,请让我知道。感谢您提前查看

表I在插入后需要更新总计列

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
就可以了。您对问题标题有什么建议吗?它可能会帮助其他人可能会“添加一个正在运行的总计列”或类似的内容。。。如果答案对你有效,不要忘记接受,这样人们就会知道你的问题已经解决了。