Во временной таблице я получаю эту ошибку: Ошибка арифметического переполнения при преобразовании числа с плавающей точкой в ​​числовой тип данных - PullRequest
0 голосов
/ 08 октября 2019

Это мой скрипт

SELECT City, Country, Density, NULL AS CityAvg
INTO #Temp
FROM CityInfo


UPDATE T1
SET CityAvg = (SELECT STDEV(Density) FROM #Temp T2 WHERE T2.Country = T1.Country)
FROM #Temp T1

При выполнении этого я получаю эту ошибку

Ошибка арифметического переполнения при преобразовании числа с плавающей точкой в ​​числовой тип данных.

Я пытался изменить NULL на 0,00 , но все равно та же ошибка

SELECT City, Country, Density, 0.00 AS CityAvg
INTO #Temp
FROM CityInfo


UPDATE T1
SET CityAvg = (SELECT STDEV(Density) FROM #Temp T2 WHERE T2.Country = T1.Country)
FROM #Temp T1

Пример данных

Country   City      Density
Australia Melbourne 23.365
Australia Sydney    25.657
Australia Perth     12.374
Canada    Toronto   27.748
Canada    Montreal  22.559

Как решить эту проблему?

Примечание: Это очень упрощенный пример моего кода.

Фактический код более сложный, поэтому мне нужно использовать таблицу #Temp, и она должнабыть в UPDATE заявлении

Ответы [ 3 ]

1 голос
/ 08 октября 2019

У меня нормально работает следующий код:

CREATE TABLE #DataSource
(
    [Country] VARCHAR(12) 
   ,[City] VARCHAR(12)
   ,[Density] DECIMAL(9, 3)
)

INSERT INTO #DataSource ([Country], [City], [Density])
VALUES ('Australia', 'Melbourne', 23.365)
      ,('Australia', 'Sydney', 25.657)
      ,('Australia', 'Perth',  12.374)
      ,('Canada', 'Toronto', 27.748)
      ,('Canada', 'Montreal', 22.559);



SELECT City, Country, Density, CAST(NULL AS DECIMAL(19, 2)) AS CityAvg
INTO #Temp
FROM #DataSource


UPDATE T1
SET CityAvg = (SELECT STDEV(Density) FROM #Temp T2 WHERE T2.Country = T1.Country)
FROM #Temp T1

SELECT *
FROM #Temp;

DROP TABLE #DataSource;
DROP TABLE #Temp;
1 голос
/ 08 октября 2019

Этот оператор:

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;

Функция окна должна иметь лучшую производительность, потому что она не будет повторятьрасчет для каждого города.

0 голосов
/ 08 октября 2019

ИСПОЛЬЗУЙТЕ ЭТО

UPDATE T1
SET CityAvg = (SELECT STDEV(ISNULL(Population , 0)) FROM #Temp T2 WHERE T2.Country = T1.Country)
FROM #Temp T1

SELECT * FROM #Temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...