08. maj 2006 - 16:44Der er
11 kommentarer og 1 løsning
Sum if int
Hej,
Jeg ville lige høre om dette kunne lade sige gøre før jeg opgiver at gøre det på database niveau.
Jeg vil have gennemsnittet af en score og det virker fint. Men problemet er at nogle af resultaterne ikke er numeriske men = n/a hvis der er nogen der ikke har kunne svare.
Kan man få et gennemsnit af den score som er numerisk?
ja det er rigigt nok, men jeg glemte lige at fortælle at jeg vælger flere felter.
SELECT AVG(felt1), AVG(felt2), osv FROM bla1 b1, bla1 b2 WHERE dit = dat
Så hvis jeg skriver felt1 != 'n/a' felt2 != 'n/a' ....
så tæller den dem slet ikke med hvis bare en af dem er n/a og hvis jeg ikke skriver det bliver avg for lille pga den springer en score over men deler dem stadig med det samme antal personer som har deltaget.
Giver det mening?, ellers må jeg tage avg i flere queries eller gøre det i programmet.
Hvis du har lagret dine point i et karakterfelt, for at få lov til at gemme dit "n/a" (hvilket absolut ikke er måden at gøre det på), kunne dette måske være sagen:
SELECT AVG(CASE WHEN felt1 = 'n/a' THEN NULL ELSE CAST(felt1 AS INTEGER) END) AS GnsFelt1, AVG(CASE WHEN felt2 = 'n/a' THEN NULL ELSE CAST(felt2 AS INTEGER) END) AS GnsFelt2
Alternativt:
SELECT AVG(NULLIF(CONVERT(felt1, INTEGER), 'n/a')) AS GnsFelt1, AVG(NULLIF(CONVERT(felt2, INTEGER), 'n/a')) AS GnsFelt2
mysql> mysql> SELECT AVG(IF(score<>'n/a',CAST(score AS SIGNED INTEGER),NULL)) FROM scores; +----------------------------------------------------------+ | AVG(IF(score<>'n/a',CAST(score AS SIGNED INTEGER),NULL)) | +----------------------------------------------------------+ | 9.5000 | +----------------------------------------------------------+ 1 row in set (0.00 sec)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.