Этот оператор:
SELECT City, Country, Density, NULL AS CityAvg
INTO #Temp
FROM CityInfo;
имеет для присвоения типа NULL
. При отсутствии другой информации SQL Server назначает ее типу NULL
. Это, вероятно, ваша проблема. Вы можете увидеть это в db <> fiddle .
Итак, приведите к нужному типу:
SELECT City, Country, Density, CAST(NULL AS float) as CityAvg
INTO #Temp
FROM CityInfo;
Или, если вы хотите скопировать то же самоевведите:
SELECT City, Country, Density, (case when 1=0 then Density end) AS CityAvg
Как только вы это сделаете правильно, вы можете упростить ваш запрос, используя оконные функции:
WITH toupdate AS (
SELECT t.*,
STDEV(Density) OVER (PARTITION BY city) as new_cityavg
FROM #temp t
)
UPDATE toupdate
SET CityAvg = new_cityavg;
Функция окна должна иметь лучшую производительность, потому что она не будет повторятьрасчет для каждого города.