2017-05-22 8 views
1

1から7までの整数でなければならないデータテーブルがありますが、データには間違いや数値以外のデータが含まれているため、列をnvarchar型変数として保存しました。今度は、間違ったデータを正しいデータの平均で評価したいと思います。つまり、値が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 

を試してみましたが、それはおよそ4.643を返し

、また

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

を返しました。

+0

ISNUMERIC()関数は非常に困難です。 –

+0

でも可能です: "しかし、データには間違いや数値以外のデータが含まれているので、列をnvarchar型変数として保存しました。" - それはあなたの問題を解決する方法ではありません。まず、整数フィールドに不正なデータが入るのをやめてください。 –

+0

私はこれが驚いた。 WHERE句は、数値を除外するように表示されます。非数値を浮動小数点に変換するか、それとも平均を見つけることができますか?できません。 –

答えて

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に追加しました。

+0

私はそれをしようとしましたが、エラーが発生しました:キーワード 'WHERE'の近くに構文が正しくありません。 – user2219896

+0

私はEND節を見逃しました。上記をもう一度お試しください。 – LunarSage

0

NULLと文字列の許容範囲を含む1から7までの整数の平均値のみが正しいですか?

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 
関連する問題