将错误数据更新为表的平均值

时间:2017-05-22 06:44:03

标签: sql-server

我有一个数据表,应该是从1到7的整数。但是数据包含错误和非数字数据,所以我将列保存为nvarchar-type变量。现在我想通过正确数据的平均值来估计错误的数据,即如果值不是从1到7,则应该更新为同一列中的数据的平均值,其中平均值已经计算在那些值为1,2,3,4,5,6或7的单元格。估计值可以是浮点数。我怎么能在MSSQL中这样做?我试过了

SELECT AVG(CAST(ky1 AS FLOAT)) FROM esimerkkikysely
WHERE NOT ISNUMERIC(ky1)=1 OR ky1 NOT BETWEEN 1 AND 7

但它返回0。

另外,

SELECT AVG(CAST(ky1 AS FLOAT)) FROM esimerkkikysely
WHERE ISNUMERIC(ky1)=1

返回4.643。

2 个答案:

答案 0 :(得分:1)

试试这个。请在新列中完成所有更新(我在下面的代码中将其称为KY2)。您要做的最后一件事就是销毁您正在使用的数据,即使它充满了错误。

UPDATE esimerkkikysely 
SET    KY2 = CASE WHEN LTRIM(RTRIM(KY1)) IN ('1','2','3','4','5','6','7')
                 THEN CONVERT(FLOAT, KY1)
             ELSE (SELECT AVG(CONVERT(FLOAT, KY1))
                   FROM   esimerkkikysely e
                   WHERE  LTRIM(RTRIM(KY1)) IN ('1','2','3','4','5','6','7')) END
WHERE  LTRIM(RTRIM(KY1)) NOT IN ('1','2','3','4','5','6','7')

我添加了TRIM,好像数据导入和你的建议一样糟糕,导入空间的可能性和搞砸比较似乎很高。

答案 1 :(得分:0)

你只想要1到7之间的整数平均值,对NULL和字符串的容差是否正确?

DECLARE @T1 TABLE (SuperColumn VARCHAR(30))
INSERT INTO @T1 VALUES ('2'), ('9874859'), ('JACKJACKSON'), ('1'), ('2'), ('2'), ('1'), ('3')

SELECT AVG(HisHighnessConverted)
FROM ( -- Do AVG only after filtering out problematic values.
    SELECT CONVERT(float, SuperColumn) AS HisHighnessConverted
    FROM @T1
    WHERE TRY_CONVERT(float, SuperColumn) BETWEEN 1 AND 7 -- Skips NULLs, failed converts, and successes outside of the BETWEEN range.
) AS T