Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Hoe "0" retourneren als SUM "null" is

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik ben bezig met een eenvoudig statistiekentooltje. Met onderstaande query tel ik alle hits en sessies in een bepaalde periode:

SQL:
1
2
3
SELECT SUM(hits) AS hits, SUM(sessions) AS visits 
FROM stats_dt
WHERE `date` BETWEEN 'toen' AND 'nu'


Als er tussen "toen en nu" geen hits waren, is de resultset leeg. Ik wil echter graag dat deze dan "0" teruggeeft, dus. Op het forum kwam ik een aantal draadjes hierover tegen, maar deze hielpen mij niet:
SQL:
1
2
SELECT SUM(ISNULL(hits, 0)) AS hits, SUM(sessions) AS visits ...
SELECT SUM(IF hits = NULL SET hits = 0 ELSE SET hits) AS hits, SUM(sessions) AS visits ...

Dit geeft allebei dikke foutmeldingen. Wie kan mij verder helpen?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
COALESCE( ... , 0 ). :)

En met IF en IS NULL kan het ook, maar dan moet je maar de IF syntax opnieuw lezen. ;) :>

[ Voor 66% gewijzigd door Voutloos op 23-03-2008 14:08 ]

{signature}


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Functies als ISNULL (en coalesce ;) ) werken niet, er is immers geen resultset om bewerkingen op door te voeren. Er zijn wel trucjes voor te bedenken, maar volgens mij moet je de presentatie van 'geen records gevonden' gewoon door de client laten afhandelen.

[ Voor 3% gewijzigd door P_de_B op 23-03-2008 14:09 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Stored procedure? :)

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
SQL:
1
SELECT SUM(COALESCE(hits, 0)) AS hits, SUM(sessions) AS visits FROM ...

Levert hetzelfde op als
SQL:
1
SELECT SUM(hits) AS hits, SUM(sessions) AS visits FROM ...
En met IF en IS NULL kan het ook, maar dan moet je maar de IF syntax opnieuw lezen. ;) :>
...dacht toch echt dat ik het goed gelezen had...back to the drawingboard dan maar :)
P_de_B schreef op zondag 23 maart 2008 @ 14:08:
Functies als ISNULL (en coalesce ;) ) werken niet, er is immers geen resultset om bewerkingen op door te voeren. Er zijn wel trucjes voor te bedenken, maar volgens mij moet je de presentatie van 'geen records gevonden' gewoon door de client laten afhandelen.
Dat had ik dus eerst. Ik loopte door de resultset en vulde dan "0" is voor een resultrow met NULL. Maar het lijkt mij netter als de database server een complete resultset teruggeeft (hetzij dus wat bewerkt), waar ik in PHP meteen mee aan de slag kan...

[ Voor 36% gewijzigd door Reveller op 23-03-2008 14:13 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • MueR
  • Registratie: Januari 2004
  • Nu online

MueR

Admin Devschuur® & Discord

is niet lief

Anyone who gets in between me and my morning coffee should be insecure.


  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

Je moet natuurlijk wel je COALESCE( ... , 0 ) om je SUM heen doen suffie ;)

Neem je whisky mee, is het te weinig... *zucht*


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
P_de_B schreef op zondag 23 maart 2008 @ 14:08:
Er zijn wel trucjes voor te bedenken,
Gewoon een constante tegen iets left joinen ed. :P
maar volgens mij moet je de presentatie van 'geen records gevonden' gewoon door de client laten afhandelen.
Dat is waar, maar in een aantal situaties is een trucje met een constante of cartesisch product icm functies als COALESCE wel kniftig.
Maar in dit geval is een succesvol uitgevoerde query met een lege resultset prima te verwerken. :)

{signature}


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
momania schreef op zondag 23 maart 2008 @ 14:12:
Je moet natuurlijk wel je COALESCE( ... , 0 ) om je SUM heen doen suffie ;)
Nouja...omdat het pasen is wijten we het maar aan de wijn ;) Thanx!

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Voutloos schreef op zondag 23 maart 2008 @ 14:13:
[...]
Gewoon een constante tegen iets left joinen ed. :P
Precies, dit kun je op veel verschillende manieren doen, maar mijn voorkeur gaat uit naar de client. De db geeft simpelweg de gevraagde records terug (of niets als er niets is gevonden) en daarmee klaar.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Aangezien het wel de (een ;) ) oplossing is, is de echte query blijkbaar een stuk uigebreider. Sowieso ken je de context niet, er zijn gewoon gevallen waarbij COALESCE het verwerken van de resultset vele malen eenvoudiger en eleganter maakt, dus die voorkeur van jou kan geen harde regel zijn.

{signature}


  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

Ik denk trouwens dat eerder hier een verkeerd datamodel is.

Als ik aantal hits wil weten uit een database denk ik aan een COUNT, die default gewoon 0 terug geeft.
Een SUM is voor andere doeleinden. :Y)

Neem je whisky mee, is het te weinig... *zucht*


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Blijkbaar hanteert de ts per session een hits eigenschap, wat niet eens een heel raar idee is, behalve dat je stats niet kloppen als je sessions een keer hard verwijderd. :P

{signature}


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Voutloos schreef op zondag 23 maart 2008 @ 14:23:
Aangezien het wel de (een ;) ) oplossing is, is de echte query blijkbaar een stuk uigebreider. Sowieso ken je de context niet, er zijn gewoon gevallen waarbij COALESCE het verwerken van de resultset vele malen eenvoudiger en eleganter maakt, dus die voorkeur van jou kan geen harde regel zijn.
COALESCE (of isnull of welke andere functie dan ook) ben ik met je eens. Dat is simpelweg een functie die je op de gevonden resultset toepast. Ik ben minder voorstander van acties waarbij je 'kunstmatig' records gaat teruggeven als er geen records gevonden worden. Ik vind het vreemd en onjuist dat een database records gaat teruggeven, puur en alleen om aan de client makkelijker te kunnen weergeven dat er geen records gevonden zijn.

Bijvoorbeeld de suggestie om te left-joinen met iets dat eigenlijk helemaal niet relevant is voor de query of de resultset kan ervoor zorgen dat het executieplan niet zo goed is als dat het zou kunnen zijn voor de gevraagde gegevens.

[ Voor 12% gewijzigd door P_de_B op 23-03-2008 14:29 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

momania schreef op zondag 23 maart 2008 @ 14:23:
Ik denk trouwens dat eerder hier een verkeerd datamodel is.

Als ik aantal hits wil weten uit een database denk ik aan een COUNT, die default gewoon 0 terug geeft.
Een SUM is voor andere doeleinden. :Y)
Het hoeft geen verkeerd datamodel te zijn. Bij mijn site houd ik per pagina bij hoevaak deze bezocht is in een 'hits' kolom. Om dan alle hits van mijn site te weten hoef ik die getallen alleen maar bij elkaar op te tellen, en daar is SUM() de aangewezen functie voor. :)

Sole survivor of the Chicxulub asteroid impact.


Verwijderd

Waarom check je dit niet in de code? If (aaa == null) var = 0;

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Verwijderd schreef op zondag 23 maart 2008 @ 14:38:
Waarom check je dit niet in de code? If (aaa == null) var = 0;
Reveller schreef op zondag 23 maart 2008 @ 14:11:
[...]
Dat had ik dus eerst. Ik loopte door de resultset en vulde dan "0" is voor een resultrow met NULL. Maar het lijkt mij netter als de database server een complete resultset teruggeeft (hetzij dus wat bewerkt), waar ik in PHP meteen mee aan de slag kan...
:>

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zondag 23 maart 2008 @ 14:38:
Waarom check je dit niet in de code? If (aaa == null) var = 0;
Nou ben ik niet superbekend met MySQL maar is het dan niet "aaa is null"?
"...in de code..." Juist ja :P En ik heb nog geen wijn op :X

[ Voor 8% gewijzigd door RobIII op 23-03-2008 15:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Volgens mij is er niet zoveel mis met NULL als resultaat (duidelijk antwoord en zoals je zegt kan je het prima verwerken in code). De SQL truckjes van hierboven komen op mij minder netjes over (query is minder duidelijk). Ik zou het gewoon zo laten als het nu is. :)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Reveller schreef op zondag 23 maart 2008 @ 14:06:
Dit geeft allebei dikke foutmeldingen. Wie kan mij verder helpen?
Heb je de MySQL documentatie van die functies wel gelezen?
Verwijderd schreef op zondag 23 maart 2008 @ 19:02:
Volgens mij is er niet zoveel mis met NULL als resultaat (duidelijk antwoord en zoals je zegt kan je het prima verwerken in code). De SQL truckjes van hierboven komen op mij minder netjes over (query is minder duidelijk). Ik zou het gewoon zo laten als het nu is. :)
SQL:
1
SELECT ifnull(SUM(hits), 0) AS hits, ifnull(SUM(sessions), 0) AS visits

Dit is toch niet minder duidelijk?

[ Voor 19% gewijzigd door Olaf van der Spek op 24-03-2008 15:22 ]

Pagina: 1