2015-10-12 2 views
0

Мне нужно обновить строки с помощью 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 

После обновления на первой строке значение должно быть: выберите КРУГЛЫЙ (10.401,2) + ROUND (60.957,2) + ROUND (70.857,2) = 10.4 + 60.96 + 70.86 = 142.22 вместо 142.215 Реальная ситуация сложнее, и я хочу избежать пересчета всех строк, поэтому предпочитаю делать обновление, а не удалять и читать их. Большое спасибо

+0

Используйте коррелированных подзапросов в заданном выражении 'SELECT SUM blah..FROM т ГДЕ somecol.UpdateData = somecol.t' – Mihai

+0

Благодаря Mihai, как это работает: с UpdateData в (Select * из TBL где SG = 'Все'!) обновление Tbl Set Val = (выберите SUM (ROUND (ud.Val, 2)) из UpdateData ud где Tbl.SG = 'Все' и ud.G = Tbl.G group by ud.G) где Tbl.SG = 'All' – JD123456

ответ

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' 
1

как это работает. Спасибо, Михай! С UpdateData в (Select * от TBL где SG! = 'Все')

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' 
+0

Группа не нужна Мне кажется – Mihai

Смежные вопросы