使用嵌套查询更新行

时间:2015-10-12 09:47:38

标签: sql sql-server-2012

我需要使用SG =' All'来更新行。通过对这些行执行一些重新计算(例如,行的总和与SG!=' All'由G列分组)。 我尝试以下面的方式进行,但是我收到了一个错误:

WITH UpdateData as
(Select * from Tbl 
where SG!='All')

update Tbl 
Set Val =(select SUM(ROUND(ud.Val,2)) group by ud.G)
from UpdateData ud
where Tbl.SG='All' and ud.G = Tbl.G

Msg 164,Level 15,State 1,Line 6 每个GROUP BY表达式必须至少包含一个不是外部引用的列。

这是表格的样子:

G   SG  I   Val
B   All All 142.215 
B   T1  123 10.401
B   T1  123 60.957
B   T2  220 70.857
D   All All 96.003
D   T3  666 80.158
D   T5  700 15.845

更新后,第一行的值应为: 选择ROUND(10.401,2)+ ROUND(60.957,2)+ ROUND(70.857,2)= 10.4 + 60.96 + 70.86 = 142.22而不是142.215 真实情况更复杂,我想避免重新计算所有行,所以我更喜欢做更新而不是删除和读取它们。非常感谢

2 个答案:

答案 0 :(得分:1)

像这样工作。谢谢Mihai!     使用UpdateData作为     (从Tbl中选择*     SG!='All')

update Tbl 
Set Val =(select SUM(ROUND(ud.Val,2))  
from UpdateData ud
where Tbl.SG='All' and ud.G = Tbl.G
group by ud.G)
where Tbl.SG='All'

答案 1 :(得分:0)

希望这会有用,

update Tbl 
set Tbl.Val = = t.Value
from
    (select SUM(ROUND(ud.Val,2)) as Value, ud.G
    from UpdateData ud
    where ud.G = Tbl.G
    group by ud.G) as t
where Tbl.SG='All'