更新 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
更新一个
设置值 = 总和(值)
从反
按 Tran 分组,[缺少空白字符] 类型
在 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
我有一个具有以下值的 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
更新一个 设置值 = 总和(值) 从反 按 Tran 分组,[缺少空白字符] 类型
在 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