我有一个数据表,应该是从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。
答案 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