MYSQL: minimale datum waarop een aantal is bereikt

Pagina: 1
Acties:

  • KrL
  • Registratie: Oktober 2001
  • Laatst online: 01-12 09:25

KrL

Foto foto..

Topicstarter
Ik zoek naar een MYSQL oplossing voor het volgende:
Stel ik heb een tabel met 3 kolommen: id, datum, bedrag

iddatumbedrag
101-01-200710
205-01-200710
310-01-200710
415-01-200710
520-01-200710


Nu wil ik hieruit de datum halen waarom de som van de bedragen een bepaalde waarde heeft bereikt, laten we zeggen 35 (dus in dat geval 15-01-2007). Als ik een MIN(datum) doe met een HAVING SUM(bedrag) >= 35 dan krijg ik 01-01-2007, als ik een MAX(datum) doe 20-01-2007..

Ik betwijfel of dit mogelijk is maar zou het toch graag bevestigd/weerlegd willen zien :)

[ Voor 3% gewijzigd door KrL op 28-03-2007 10:35 ]


Verwijderd

KrL schreef op woensdag 28 maart 2007 @ 10:34:
Nu wil ik hieruit de datum halen waarom de som van de bedragen een bepaalde waarde heeft bereikt, laten we zeggen 35 (dus in dat geval 15-01-2007). Als ik een MIN(datum) doe met een HAVING SUM(bedrag) >= 35 dan krijg ik 01-01-2007, als ik een MAX(datum) doe 20-01-2007..
Je wilt de bedragen optellen totdat ze een bepaald bedrag vormen (in jouw voorbeeld 35 of meer). Je wilt één datum terughalen? Of wil je alle data terug halen die het bedrag vormen? Ik vind 't onduidelijk, maar dat kan aan mij liggen :P

  • KrL
  • Registratie: Oktober 2001
  • Laatst online: 01-12 09:25

KrL

Foto foto..

Topicstarter
Verwijderd schreef op woensdag 28 maart 2007 @ 10:39:
[...]
Je wilt de bedragen optellen totdat ze een bepaald bedrag vormen (in jouw voorbeeld 35 of meer).
Ja
Je wilt één datum terughalen?
Ja, dus de eerste datum waarop aan de voorwaarde (som van de bedragen >= 35) is voldaan..

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
een join met zichzelf op een datum met alle datums ervoor... daar de som van nemen... dan alleen die sommen nemen die groter zijn dan je gezochte waarde, oplopend sorteren en een limit van 1 nemen... dan heb je je gezochte datum...

Verwijderd

ik denk dat de handigste oplossing is als je het bedrag cumulatief maakt (of een extra kolom daarvoor toevoegt). Natuurlijk kun je dat wel on the fly doen met een query, maar zo ver ik kan zien kan dat alleen met unions en een subquery voor elke entry, dust dat is niet zo'n goed idee, of het moet zijn dat je in een hele beperkte datum-range wil zoeken, of enkel per maand en niet exact de dag oid? Dan nog zou het veel langzamer zijn dan gebruik maken van een extra cumulatief bedrag veld. En ik weet ook niet of zo'n query wel mogelijk is met mySQL

Verwijderd

Voor zover ik weet (en zo kan bedenken) is dat niet te doen (of je maakt het jezelf erg lastig). Je kan ook gewoon een result set ophalen van alle data die het gewenste bedrag vormen en dan in de code de datum eruit halen.

  • xos
  • Registratie: Januari 2002
  • Laatst online: 25-11 17:08

xos

Je kan een subquery gebruiken. Even uit het hoofd zou op sqlserver het volgende moeten werken:
SQL:
1
2
3
4
5
6
select top 1
    a.id    
,   a.datum
from tabel a
where @bedrag <= (select sum(b.bedrag) as totaal from tabel b where b.datum <= a.datum)
order by a.datum asc


Waarbij @bedrag je minimale waarde is.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
On the fly het cumulatieve bedrag bepalen kan op de manier van Edwardvb en xos.

Als je dit echter vaak nodig hebt, of die tabel erg groot wordt, is het het overwegen waard om een kolom voor de cumulatieve waarde op te nemen. Dit zou vooral lekker werken als je de zekerheid hebt dat een nieuw record niet een oudere datum heeft, zodat je niet steeds alle cumulatieve waarden moet updaten. Die laatste opmerking geeft natuurlijk al aan waarom je kan gaan balen van redundante data. :P

Vul anders die tabel met lekker veel rijen en test hoe traag een query zonder redundante data is. :)

{signature}


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 08:59
Gewoon met een join op zichzelf;
SQL:
1
2
3
4
5
6
7
SELECT b1.datum, SUM(b2.bedrag)
FROM bedragen AS b1
LEFT JOIN bedragen AS b2 ON b2.datum <= b1.datum
GROUP BY b1.datum
HAVING SUM(b2.bedrag) >= 35
ORDER BY b1.datum ASC 
LIMIT 1


edit:
Wat Edwardvb dus zei

[ Voor 8% gewijzigd door frickY op 28-03-2007 11:19 ]


  • KrL
  • Registratie: Oktober 2001
  • Laatst online: 01-12 09:25

KrL

Foto foto..

Topicstarter
frickY schreef op woensdag 28 maart 2007 @ 11:18:
Gewoon met een join op zichzelf;

edit:
Wat Edwardvb dus zei
That seems to work, thanks !

edit:
Group by moet alleen wel op de id, niet op datum..

[ Voor 13% gewijzigd door KrL op 28-03-2007 13:29 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 08:59
True. Deze zou fout gaan als je 2x dezelfde datum gebruikt.
Pagina: 1