[php/MySQL] gemiddelde uitrekenen van 1,0 en NULL

Pagina: 1
Acties:
  • 472 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil met php wat gemiddelden uit een MySQL-database ophalen en verwerken in een html-tabel.

De data bestaat in principe uit 1-en en 0-en. Ik wil van iedere kolom de gemiddelde waarde hebben. Dus ik doe

code:
1
SELECT avg(`score1`) FROM `tabel` WHERE etc.


Nu is het probleem dat er in sommige gevallen NULL staat i.p.v. 1 of 0. Wat ik wil, is dat deze NULL-waarden wel worden meegenomen in de gemiddelde-berekening, maar dat deze meetellen als waarde 1.

Dus het gemiddelde van 1, 1, 0 en NULL moet 0,75 opleveren.

Het wijzigen van de data in de database zelf is geen optie.

Ik zit eraan te denken om gewoon het totaal aantal waarden te tellen, dan het aantal 0-en (dat moet neem ik aan kunnen in MySQL) en op die manier het gemiddelde uit te rekenen.

Maar heeft MySQL misschien een eenvoudiger manier?

Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 14:31
code:
1
SELECT avg(IF(`score1` IS NULL, 1, `score1`)) FROM `tabel` WHERE etc.

Zo kan je ook andere default waarden gebruiken.

Is het trouwens geen idee om de default waarde van het veld '1' te maken? Daarmee voorkom je dergelijke in feite ongeldige waarden.

[ Voor 45% gewijzigd door sjroorda op 24-01-2007 12:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
SELECT avg(IF(`score1` IS NULL, 1, `score1`)) FROM `tabel` WHERE etc.

Zo kan je ook andere default waarden gebruiken.
Dank, dat ziet eruit als wat ik zocht! Ik ga het zo checken.
Is het trouwens geen idee om de default waarde van het veld '1' te maken? Daarmee voorkom je dergelijke in feite ongeldige waarden.
Dat gaat niet helpen. NULL is geen "foutje", maar heeft wel degelijk een specifieke betekenis. In andere gevallen moet NULL wél als anders dan 1 worden geïnterpreteerd.

Dank voor de snelle reactie.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:45
Dat gaat niet helpen. NULL is geen "foutje", maar heeft wel degelijk een specifieke betekenis. In andere gevallen moet NULL wél als anders dan 1 worden geïnterpreteerd.
:?
Is het dan niet beter om dit op een andere manier op te lossen ? Nu ga je eigenlijk een waarde gaan geven aan een NULL veld (wat wil zeggen: onbepaald), en die waarde is totaal afhankelijk van de context.... Iets in me zegt dat dit na verloop van tijd niet echt onderhoudbaar zal zijn...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Wokkels
  • Registratie: Juli 2000
  • Laatst online: 29-10-2024

Wokkels

Het lekkerste zoutje

Verwijderd schreef op woensdag 24 januari 2007 @ 12:18:
[...]


Dat gaat niet helpen. NULL is geen "foutje", maar heeft wel degelijk een specifieke betekenis. In andere gevallen moet NULL wél als anders dan 1 worden geïnterpreteerd.

Dank voor de snelle reactie.
Nu je aanvankelijke 'probleem' is opgelost zou ik gaan nadenken over het ontwerp van je DB. Als NULL niet altijd NULL moet betekenen dan is er in het ontwerp toch al iets flink fout gegaan lijkt mij :)
Overigens is dat voor de onderhoudbaarheid van je applicatie ook niet al te handig, denk aan toekomstige ontwikkelaars die met zulke vreemde dingen rekening moeten gaan houden...

IMO kan 'NULL' nooit '1' betekenen. In welke situatie dan ook.

:w whoami :)

Permanent wintericon!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Is het dan niet beter om dit op een andere manier op te lossen ? Nu ga je eigenlijk een waarde gaan geven aan een NULL veld (wat wil zeggen: onbepaald), en die waarde is totaal afhankelijk van de context.... Iets in me zegt dat dit na verloop van tijd niet echt onderhoudbaar zal zijn...
edit:
ook @ Wokkels


Ik kan hier niet het achterste van mijn tong laten zien, maar het komt erop neer dat het hier gaat om beoordelingen, die individueel worden teruggekoppeld, maar ook in grote aantallen moeten worden verwerkt tot gemiddelden.

In een evaluatiegesprek over een individuele record moet de NULL-waarde behouden blijven, want dan betekent ze "n.v.t." De wetenschap dat een item niet van toepassing was, moet behouden blijven.

Bij het berekenen van gemiddelde scores per item, mag een NULL/n.v.t.-waarde geen nadelige invloed hebben (mag dus geen 0 worden), maar ze mag ook de weging niet beïnvloeden (mag dus niet weggelaten worden). Vandaar dat ze dan telt als 1.

Kortom: de NULL-en moeten behouden blijven, maar bij het berekenen van gemiddelden moeten ze als 1 tellen. Het is niet anders.

(Tot nog toe dumpte ik alles naar Excel, veranderde de NULL-en naar 1 en liet Excel de rest doen. Dit was geen ideale oplossing (niet de mijne trouwens ;)), dus daarom pak ik het nu in php aan.)

Acties:
  • 0 Henk 'm!

  • MIster X
  • Registratie: November 2001
  • Laatst online: 16-01 09:39
Verwijderd schreef op woensdag 24 januari 2007 @ 12:42:
Bij het berekenen van gemiddelde scores per item, mag een NULL/n.v.t.-waarde geen nadelige invloed hebben (mag dus geen 0 worden), maar ze mag ook de weging niet beïnvloeden (mag dus niet weggelaten worden). Vandaar dat ze dan telt als 1.
Sorry, maar dit snap ik niet. Het gemiddelde van 1, 1, 0 en NULL is per definitie 0,667, en niet 0.75. Niet beïnvloeden = weglaten. Als je NULL telt als 1 gaan ze wel degelijk de weging beïnvloeden... Zou wat zijn als iemand op school voor elk gemiste proefwerk automatisch een 10 kreeg :?

[ Voor 11% gewijzigd door MIster X op 24-01-2007 14:53 ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Meest simpele geval: 1 rij, met NULL. Per definitie is een gemiddelde over een verzameling met 1 element gelijk aan dat ene element => NULL

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

Verwijderd

MIster X schreef op woensdag 24 januari 2007 @ 14:50:
Sorry, maar dit snap ik niet. Het gemiddelde van 1, 1, 0 en NULL is per definitie 0,667, en niet 0.75.
Hoezo 'per definitie' ?
NULL houdt in: niet gedefinieerd, en is nergens mee te vergelijken. Zelfs NULL = NULL hoort altijd false op te leveren, en bij geaggregeerde functies (zoals jouw AVG()) waar ook maar 1 NULL voorkomt, hoor je NULL als result te krijgen. Wil je dat voorkomen, dan moet je die NULL velden uitfilteren of vervangen door iets wat je wel kunt aggregeren.

Acties:
  • 0 Henk 'm!

  • hing
  • Registratie: Augustus 2002
  • Laatst online: 19-05-2023
Verwijderd schreef op woensdag 24 januari 2007 @ 22:45:
[...]
Hoezo 'per definitie' ?
NULL houdt in: niet gedefinieerd, en is nergens mee te vergelijken. Zelfs NULL = NULL hoort altijd false op te leveren, en bij geaggregeerde functies (zoals jouw AVG()) waar ook maar 1 NULL voorkomt, hoor je NULL als result te krijgen. Wil je dat voorkomen, dan moet je die NULL velden uitfilteren of vervangen door iets wat je wel kunt aggregeren.
Binnen de statistiek is het resultaat wel degelijk 0,667
NULL values tellen niet mee. Zie het verhaal van Mister X over de proefwerken

Wat jij als NULL ziet is geen NULL, maar een missing value. dat is heel iets anders. Voor een missing value geldt inderdaad dat een aggregrate functie een missing value oplevert. Maar dat is geen NULL

[ Voor 7% gewijzigd door hing op 25-01-2007 12:49 ]

Pagina: 1