【问题标题】:Insert accumulated total to my table in SQL Server 2008在 SQL Server 2008 中将累计总数插入我的表中
【发布时间】:2014-08-18 11:50:34
【问题描述】:

我想这样计算总和(idd 不是主键或外键)

idd    svalue      acctotal
1       5             5
2       6             11
1       2             13
3       4             17
2       1             18

等等

我在许多触发器中工作,但没有成功:

 create trigger acc on detail 
 for update, insert 
 as 
     DECLARE @AccountID INT
     DECLARE @getAccountID CURSOR

     SET @getAccountID = CURSOR FOR
        SELECT idd
        FROM detail

     declare @tot as int
     set @tot = (select sum(dvalues) from detail)

     OPEN @getAccountID

     FETCH NEXT FROM @getAccountID INTO @AccountID

     WHILE @@FETCH_STATUS = 0
     BEGIN
        PRINT @AccountID

        UPDATE detail 
        SET acctotal = @tot

        FETCH NEXT FROM @getAccountID INTO @AccountID
     END

     CLOSE @getAccountID

【问题讨论】:

  • 真的需要存储累计值吗?为什么不只计算输出呢?如果你确实存储它,你还需要一个delete 触发器。
  • 是的,我真的想要这个……输出很简单,@gorden linoff 先生
  • 没有某种顺序是没有意义的。您需要一个列来告诉您这些记录需要按什么顺序添加。听从 Linoff 先生的建议 - 这可能是个坏主意。
  • 不可能...编程@electricliama 没有坏主意
  • 我不确定我是否理解,但如果没有在表格中定义顺序的列,您将获得“不可预测的结果”

标签: sql sql-server sql-server-2008 triggers


【解决方案1】:

你不能这样做吗:

@tot = (select top 1 isnull(acctotal, 0) + @newvalue from detail order by acctotal desc)

这只有在您只处理正数时才有效......关于订购独特事物的建议是最好的方法。即使只是添加一个种子列也可以按顺序工作。

问候

利亚姆

【讨论】:

    【解决方案2】:

    你可以把触发器写成:

    create trigger acc on detail for update, insert 
    as 
    
    ;with cte as
    (
        select idd,svalue,acctotal, row_number() over ( order by (select 1)) as rownum
        from detail
    )
    Update T1 set acctotal = 
            (SELECT SUM(svalue)
             from cte as T2
             where T1.rownum >= T2.rownum )        
    from cte T1
    
    Go
    

    Check Demo here..

    【讨论】:

    • 我的两个陈述是:坏主意,您需要订购,但我猜您会对此感到满意。
    • 我可以向您保证,它不能完美运行。但我会让你自己找出来。
    • hhhh >>> 为什么你不相信 ,,, 拿代码试试看...萨拉姆... @electricliama
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2010-11-25
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多