[MSSQL] Start en Einddatum in een range

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste Mensen,

Ik heb een tabel met polissen deze hebben een startdatum, einddatum en een maandbedrag.
Ik moet een query bouwen waarbij de eindgebruiker een datum range aangeeft (1-1-2009 t/m 1-11-2009. Vervolgens moeten de totalen maandbedragen per maand worden weergegeven. Rekening gehouden dat een polis in deze reeks maanden gestart of beëindigd kan worden.

Ik heb me bedacht dat ik in het bovenste voorbeeld 11 keer een query moet uitvoeren (per maand). Ik denk dat er een betere manier voor bestaat maar heb deze nog niet gevonden. Ik hoop dat jullie me in de juiste richting kunnen leiden.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Check eens de aggregate functie SUM en de GROUP BY clausule.
Check ook de MONTH functie.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • glmona
  • Registratie: Maart 2005
  • Laatst online: 15-08 06:22
En ook de YEAR functie, mocht de periode over meerdere jaren gaan..

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

glmona schreef op dinsdag 03 november 2009 @ 10:28:
En ook de YEAR functie, mocht de periode over meerdere jaren gaan..
Niet eens zozeer dat, maar vooral ook als er data van meerdere jaren in de database staat. ;)

Overigens kun je bij meer arbitraire ranges (15 juni tot en met 4 augstus ofzo :P ) ook BETWEEN gebruiken, maar dat zou het groupen per maand weer iets lastiger maken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Hoezo is groeperen lastiger? Je kunt in je view toch gewoon een nieuwe list beginnen als de maand is veranderd tov. de vorige row? En de bedragen kun je in een array oid bijhouden om onderaan de totalen te laten zien. Of begrijp ik niet helemaal wat de TS wil? :+

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Cartman! schreef op dinsdag 03 november 2009 @ 11:44:
Hoezo is groeperen lastiger? Je kunt in je view toch gewoon een nieuwe list beginnen als de maand is veranderd tov. de vorige row? En de bedragen kun je in een array oid bijhouden om onderaan de totalen te laten zien. Of begrijp ik niet helemaal wat de TS wil? :+
Groupen gaat in de query al hoor, heb je geen code voor nodig in je view. ;)

SQL:
1
SELECT SUM(...), MONTH(datum) FROM tabel WHERE YEAR(datum) = 2009 GROUP BY MONTH(datum)

Mijn punt was meer dat je met arbitraire datums waarschijnlijk gelijke periodes wil laten zien in plaats van aantallen per maand, maar da's niet zozeer relevant voor de topicstarter en meer bedoeld als kanttekening voor andere gebruikers die het lezen. :)

[ Voor 18% gewijzigd door NMe op 03-11-2009 11:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op dinsdag 03 november 2009 @ 11:47:
[...]
Mijn punt was meer dat je met arbitraire datums waarschijnlijk gelijke periodes wil laten zien in plaats van aantallen per maand, maar da's niet zozeer relevant voor de topicstarter en meer bedoeld als kanttekening voor andere gebruikers die het lezen. :)
Als je het hebt over "versprongen" maanden ( dus van 5-10 tot 5-11 ipv 1-10 tot 1-11 ) dan kun je dat ook redelijk eenvoudig doen met een datediff waarschijnlijk

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe schreef op dinsdag 03 november 2009 @ 11:47:
[...]

Groupen gaat in de query al hoor, heb je geen code voor nodig in je view. ;)

SQL:
1
SELECT SUM(...), MONTH(datum) FROM tabel WHERE YEAR(datum) = 2009 GROUP BY MONTH(datum)

Mijn punt was meer dat je met arbitraire datums waarschijnlijk gelijke periodes wil laten zien in plaats van aantallen per maand, maar da's niet zozeer relevant voor de topicstarter en meer bedoeld als kanttekening voor andere gebruikers die het lezen. :)
Ik denk dat ik dan iets anders bedoel dan jij. Ik bedoel alle rows ophalen tussen 2 data met BETWEEN en daarna in je view een scheiding maken tussen de maanden, layout-technisch dus om een scheiding te maken tussen de maanden.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Cartman! schreef op dinsdag 03 november 2009 @ 13:15:
[...]

Ik denk dat ik dan iets anders bedoel dan jij. Ik bedoel alle rows ophalen tussen 2 data met BETWEEN en daarna in je view een scheiding maken tussen de maanden, layout-technisch dus om een scheiding te maken tussen de maanden.
SQL:
1
SELECT SUM(...), MONTH(datum) FROM tabel WHERE datum BETWEEN '20090101' AND '20091231' GROUP BY MONTH(datum)

;)

Je database heeft dan die scheiding tussen de maanden al gemaakt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op dinsdag 03 november 2009 @ 13:24:
[...]

SQL:
1
SELECT SUM(...), MONTH(datum) FROM tabel WHERE datum BETWEEN '20090101' AND '20091231' GROUP BY MONTH(datum)

;)

Je database heeft dan die scheiding tussen de maanden al gemaakt. :)
offtopic:
En je mist de data van 31 december ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Details. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Niet, BETWEEN is INCLUSIVE in SQL Server.
MS raadt between bij data af, vooral als je timestamps / datetime velden gebruikt. Juist omdat het inclusive is. Je kan het beter zo doen: date >= 31122005 and date < 01012006

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Macros schreef op dinsdag 03 november 2009 @ 13:32:
Niet, BETWEEN is INCLUSIVE in SQL Server.
MS raadt between bij data af, vooral als je timestamps / datetime velden gebruikt. Juist omdat het inclusive is. Je kan het beter zo doen: date >= 31122005 and date < 01012006
als je een DateTime met between queryd dan worden de between parameters toch gewoon naar een DateTime omgezet? Dat zou betekenen dat '2009-12-31' automatisch gevonverteerd word naar de datum 2009-12-31 00:00 en dus valt alles vanaf 2009-12-31 00:01 er al af.

Ik zal het zo eens even testen

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe schreef op dinsdag 03 november 2009 @ 13:24:
[...]

SQL:
1
SELECT SUM(...), MONTH(datum) FROM tabel WHERE datum BETWEEN '20090101' AND '20091231' GROUP BY MONTH(datum)

;)

Je database heeft dan die scheiding tussen de maanden al gemaakt. :)
Nog steeds niet wat ik bedoel, laat maar dan ;)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is inderdaad niet inclusive op dag nivo.

SQL:
1
select * from dbo.Test

Resultaat
2009-01-01 00:00:00.000
2009-01-02 00:00:00.000
2009-12-31 00:00:00.000
2009-12-31 01:00:00.000

SQL:
1
2
select * from dbo.Test
where SomeDate between '2009-1-1' and '2009-12-31'

Resultaat:
2009-01-01 00:00:00.000
2009-01-02 00:00:00.000
2009-12-31 00:00:00.000

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Klopt volgens mij wel ja, Woy. Between is dus best te gebruiken, mits je ook maar een tijd opgeeft. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NMe schreef op dinsdag 03 november 2009 @ 13:45:
Klopt volgens mij wel ja, Woy. Between is dus best te gebruiken, mits je ook maar een tijd opgeeft. ;)
Of accepteren dat een actie middernacht nog bij de vorige dag/maand meetelt ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Woy schreef op dinsdag 03 november 2009 @ 13:48:
[...]

Of accepteren dat een actie middernacht nog bij de vorige dag/maand meetelt ;)
Je moet er wel erg mee oppassen hoor. Ik zou between gewoon niet gebruiken in datetime's. Want naast dit issue kan een datetime (datetime2 wel) niet zomaar alle times aan. Als je bijvoorbeeld het hele jaar wilt hebben in een between, dan moet je doen:
between 2006-01-01T00:00:00.000 and 2006-12-31T23:59:59.999
Maar 2006-12-31T23:59:59.999 past niet in een datetime, de laatste die er wel in past is 2006-12-31T23:59:59.997. Dus 2006-12-31T23:59:59.999 wordt naar 2007-01-01T00:00:00.000 afgerond.
Dus dan moet je eigenlijk doen:
between 2006-01-01T00:00:00.000 and 2006-12-31T23:59:59.997
wat natuurlijk een beetje vreemd is.
Of je gebruikt gewoon
date >= 2006-01-01T00:00:00.000 and date < 2007-01-01T00:00:00.000
En dan kan je de tijden weglaten:
date >= 2006-01-01 and date < 2007-01-01

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Macros schreef op dinsdag 03 november 2009 @ 14:12:
[...]

Je moet er wel erg mee oppassen hoor. Ik zou between gewoon niet gebruiken in datetime's. Want naast dit issue kan een datetime (datetime2 wel) niet zomaar alle times aan. Als je bijvoorbeeld het hele jaar wilt hebben in een between, dan moet je doen:
between 2006-01-01T00:00:00.000 and 2006-12-31T23:59:59.999
Maar 2006-12-31T23:59:59.999 past niet in een datetime, de laatste die er wel in past is 2006-12-31T23:59:59.997. Dus 2006-12-31T23:59:59.999 wordt naar 2007-01-01T00:00:00.000 afgerond.
Dus dan moet je eigenlijk doen:
between 2006-01-01T00:00:00.000 and 2006-12-31T23:59:59.997
wat natuurlijk een beetje vreemd is.
Of je gebruikt gewoon
date >= 2006-01-01T00:00:00.000 and date < 2007-01-01T00:00:00.000
En dan kan je de tijden weglaten:
date >= 2006-01-01 and date < 2007-01-01
O op zich heb je wel een punt hoor, en aangezien het alternatief net zo eenvoudig is zou ik zeker daarvoor kiezen. Echter is het vaak niet zo'n ramp als de randgevallen met de vorige dag meegenomen worden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Woy schreef op dinsdag 03 november 2009 @ 14:17:
[...]

O op zich heb je wel een punt hoor, en aangezien het alternatief net zo eenvoudig is zou ik zeker daarvoor kiezen. Echter is het vaak niet zo'n ramp als de randgevallen met de vorige dag meegenomen worden.
De ervaring met mijn klanten is dat geen ramp, totdat ze er ineens achter komen en een bepaald rapport in bepaalde gevallen net de verkeerde data teruggeeft. Ze zitten er al niet op te wachten als een bedrag ergens met 1 cent afwijkt.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mensen bedankt voor jullie input. maaar
Dit is niet wat ik bedoel. Een polis loopt door tot de eindatum en start op een startdatum. Dus elke maand wordt het bedrag steed groter. omdat de waarde van de vorige maand ook meegenomen moet worden.

Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Is dat dan met of zonder rente?

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Geef dan eens een eenvoudig voorbeeldje wat je precies aan data hebt, en wat je daar voor data uit wil krijgen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Range Jan 2009 t/m Mrt 2009

Startdatum Einddatum Bedrag
1-4-2008 31-3-2009 50
1-1-2009 28-2-2009 10
1-2-2009 28-2-2009 5
1-1-2009 31-12-2009 50

Jan 110 3
Feb 115 4
Mrt 100 2

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik denk dat je dat het makkelijkst voor elkaar kunt krijgen door gewoon alle records die binnen die periode vallen te selecteren, en dan in je code met een loopje de bedragen bij elkaar optellen.

code:
1
2
3
4
5
6
7
8
9
10
11
foreach( month in periode )
{
    foreach( record in result )
    {
         if( isRecordActiveInMonth(record)  )
         {
              month.Total += record.Bedrag;
              month.NumActiveRecords++;
         }
    }
}

[ Voor 40% gewijzigd door Woy op 03-11-2009 20:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1