Onkohan tällainen helppo tehdä MSSQL:llä? Mulla on annettu taulu ja siinä varchar-kenttä. Siinä pitäisi olla kokonaislukuja annetusta väliltä, mutta aineistossa on virheitä, jolloin osa datasta on jotain muuta. Nyt haluaisin approksimoida näitä varmasti virheellisiä oikealta näyttävien keskiarvolla ja päivittää virheelliset arvot. Approksimatio saa olla desimaaliluku, kun haluan tietää, miltä datasta laskettu suure näyttäisi korvaamalla virheelliset keskiarvolla.
No ihan äkkiseltään päästä heittämällä esim. näin. (Syntaksivirheitä ja ajatusvirheitä voi olla)
UPDATE [Taulu] SET [Arvo]=( SELECT AVG(CAST([Arvo] AS NUMERIC(20,5))) FROM Taulu WHERE ISNUMERIC([Arvo]) ) WHERE NOT ISNUMERIC([Arvo])
Hmm. Ei tuo vissiin toimi ihan suoraan. Ainakin ISNUMERIC-testi pitää olla muodossa ISNUMERIC(ky1)=1. Sain tuon keskiarvon laskettua. Laskettu keskiarvo pitäisi vielä heittää sopivalla updatella riveihin, joissa on varmasti väärä arvo.
SELECT AVG(CAST(ky1 AS FLOAT)) FROM esimerkkikysely WHERE ky1 IN ('1','2','3','4','5','6','7')
Stackoverflowsta tuli vinkki (https://stackoverflow.com/questions/44106205/
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')) WHERE LTRIM(RTRIM(KY1)) NOT IN ('1','2','3','4','5','6','7')
Tämä kuitenkin palautti virheen:
Msg 156, Level 15, State 1, Line 7 Incorrect syntax near the keyword 'WHERE'.
CASE-rakenteen lopusta (eli ennen jälkimmäistä WHERE-sanaa) puuttuu END.
Aihe on jo aika vanha, joten et voi enää vastata siihen.