更新 SQL 服务器中的 table(没有来自 select 的输出)

Update a table in SQL server (without output from select)

我有一个具有以下值的 table (tran):

Set  Type  Acc         Type        Tran               Value
---- ----- ----------  ---------- ------------------- -----------
1    BS    87411       CCHQ       Other Transactions  -200
1    BS    87411       RECPT      Other Transactions  200
1    BS    87411       CCHQ       Other Transactions  -200
1    BS    87411       RECPT      Other Transactions  200

如何更新此 table 以按类型订购商品。我应该提到这段代码是 SP 的一部分,我不能使用 select 因为我不想通过更新 table.

来输出

我试过类似的方法:

update a
set Value = sum(Value)
from tran a
group by TranType

但这不起作用,显示错误"incorrect syntax near group"

你不能这样做。试试这个:

update a
set a.Value = t.Total
from tran a
INNER JOIN
(
   SELECT TranType, SUM(Value) Total
   FROM tran
   GROUP BY TranType
) AS t ON a.TranType = t.TranType

更新一个 设置值 = 总和(值) 从反 按 T​​ran 分组,[缺少空白字符] 类型

在 SQL 服务器中,一个很好的方法是使用 updatable CTE 和 window 函数:

with toupdate as (
      select t.*, sum(value) over (partition by trantype) as newvalue
      from tran
     )
update toupdate
    set vaule = newvalue;

也就是说,用总和覆盖原始数据似乎很奇怪。你不应该把它放在另一列或另一个 table 吗?

SQL 中 table 的 'order' 根据定义不在存储中。

如果在请求 SQL 语句中没有 'order by' 子句,结果的顺序可能是随机的(或由数据库首选提取例程给出)。

如果有 'order by' 子句,结果将按该子句排序。

这是您可以做的事情之一,恐怕无法摆脱 DELETE 语句..因为您将无法通过具有汇总的唯一行来覆盖现有数据值而不删除它。

        BEGIN TRANSACTION

            SELECT ROW_NUMBER() OVER (ORDER BY Type2) AS UniqueID, *    --- Create Unique ID if you don't already have one.
            INTO #tmpTransactionTypes
            FROM dbo.TransactionTypes_Test;

            UPDATE A
            SET A.Value = B.Total
            FROM #tmpTransactionTypes AS A
             INNER JOIN (
                  SELECT  Type2, SUM(Value)  AS Total
                  FROM    #tmpTransactionTypes
                  GROUP BY Type2) AS B  ON A.Type2 = B.Type2;


            DECLARE @FirstValue INT = 1
            DECLARE @LastValue INT = (SELECT MAX(UniqueID) FROM #tmpTransactionTypes)

            WHILE @FirstValue <= @LastValue

            BEGIN

                DELETE
                FROM #tmpTransactionTypes
                WHERE UniqueId = @FirstValue;

             SET @FirstValue = @FirstValue +2

            END


            SELECT  *
            FROM    #tmpTransactionTypes;

        -- COMMIT TRANSACTION
        ROLLBACK TRANSACTION

结果:

       UniqueID  Set    Type1   Acc     Type2      Tran              Value
         2        1       BS   87411    CCHQ    Other Transactions  -400.00
         4        1       BS   87411    RECPT   Other Transactions   400.00