Мне нужно обновить строки с помощью 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 Реальная ситуация сложнее, и я хочу избежать пересчета всех строк, поэтому предпочитаю делать обновление, а не удалять и читать их. Большое спасибо
Используйте коррелированных подзапросов в заданном выражении 'SELECT SUM blah..FROM т ГДЕ somecol.UpdateData = somecol.t' – Mihai
Благодаря 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