Avatar billede jaspers_cool Nybegynder
08. maj 2006 - 16:44 Der 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?

tak på forhånd
Jesper
Avatar billede michael_stim Ekspert
08. maj 2006 - 16:46 #1
WHERE felt IS NOT NULL
måske
Avatar billede michael_stim Ekspert
08. maj 2006 - 16:47 #2
Eller WHERE felt <> 'n/a'
Hvis det ikke er et NULL felt
Avatar billede michael_stim Ekspert
08. maj 2006 - 16:49 #3
Eller det må jo nästen väre et numerisk felt ;o)
SELECT AVG(felt) AS gennemsnit FROM tabel WHERE felt IS NOT NULL
Avatar billede jaspers_cool Nybegynder
08. maj 2006 - 17:10 #4
Hej Michael tak for svaret,

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.
Avatar billede arne_v Ekspert
08. maj 2006 - 17:41 #5
hvis du havde brugt et INTEGER felt og NULL for at markere N/A saa
kunne du bare havde brugt

SELECT AVG(felt),...

fordi den selv springer NULL vaerdier over

Det lyder som at du har brugt en VARCHAR og fyldt 'n/a' i for manglende vaerdier.

Men det giver mig foelgende ide:

SELECT AVG(IF(felt<>'n/a',CAST(felt AS INTEGER),NULL),...
Avatar billede jaspers_cool Nybegynder
08. maj 2006 - 18:40 #6
Hmm det lyder spændende, men den melder fejl.

selvom jeg kun bruger if og skærer cast fra...

SELECT AVG(IF(felt <> 'n/a'))

bruges cast til at få den til at behandle feltet som en null værdi?
og mere vigtigt hvad gør jeg galt ;-)
Avatar billede arne_v Ekspert
08. maj 2006 - 19:10 #7
det der kan vist ikke virke - IF tager 3 argumenter

proev med den version jeg skrev
Avatar billede kjulius Novice
08. maj 2006 - 20:27 #8
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
Avatar billede kjulius Novice
08. maj 2006 - 20:33 #9
I den sidste version skulle jeg vist ved nærmere eftertanke have byttet om på funktionernes rækkefølge:

SELECT AVG(CONVERT(NULLIF(felt1, 'n/a'), INTEGER)) AS GnsFelt1, AVG(CONVERT(NULLIF(felt2, 'n/a'), INTEGER)) AS GnsFelt2
Avatar billede arne_v Ekspert
09. maj 2006 - 03:34 #10
jeg måtte tilføje en signed men så virker det

-- the workaround

CREATE TABLE scores (navn VARCHAR(20) NOT NULL, score VARCHAR(20), PRIMARY KEY(navn));

INSERT INTO scores VALUES('Anders Andersen', '10');
INSERT INTO scores VALUES('Børge Børgesen', '9');
INSERT INTO scores VALUES('Christen Christensen', 'n/a');

SELECT AVG(IF(score<>'n/a',CAST(score AS SIGNED INTEGER),NULL)) FROM scores;

DROP TABLE scores;

-- the rigth way

CREATE TABLE scores (navn VARCHAR(20) NOT NULL, score INTEGER, PRIMARY KEY(navn));

INSERT INTO scores VALUES('Anders Andersen', 10);
INSERT INTO scores VALUES('Børge Børgesen', 9);
INSERT INTO scores VALUES('Christen Christensen', NULL);

SELECT AVG(score) FROM scores;

DROP TABLE scores;

giver:

mysql> -- the workaround
mysql>
mysql> CREATE TABLE scores (navn VARCHAR(20) NOT NULL, score VARCHAR(20), PRIMARY KEY(navn));
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> INSERT INTO scores VALUES('Anders Andersen', '10');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO scores VALUES('Borge Borgesen', '9');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO scores VALUES('Christen Christensen', 'n/a');
Query OK, 1 row affected (0.00 sec)

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)

mysql>
mysql> DROP TABLE scores;
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> -- the rigth way
mysql>
mysql> CREATE TABLE scores (navn VARCHAR(20) NOT NULL, score INTEGER, PRIMARY KEY(navn));
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> INSERT INTO scores VALUES('Anders Andersen', 10);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO scores VALUES('Borge Borgesen', 9);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO scores VALUES('Christen Christensen', NULL);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT AVG(score) FROM scores;
+------------+
| AVG(score) |
+------------+
|    9.5000 |
+------------+
1 row in set (0.00 sec)

mysql>
mysql> DROP TABLE scores;
Query OK, 0 rows affected (0.00 sec)
Avatar billede jaspers_cool Nybegynder
09. maj 2006 - 13:08 #11
Tusind tak for alle kommentarerne, det er jo næsten for meget ;-)

Den rigtige løsning er jo nok at konvertere det om til en integer, så jeg bare kan bruge avg selvom if'en også virkede.

Jeg tror Arne var inde på den rigtige metode fra starten af, så smider du et svar.
Avatar billede arne_v Ekspert
09. maj 2006 - 13:16 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester