Evo jednog malo uproscenog problema.
Firma ima klijente i hoce da ih rangira po brzini i redovnosti placanja faktura.
Faktura u bazi (izmedju ostalog) ima svoj broj, datum kada je izdata i datum kada je placena. Here comes the worst: ponekad klijent moze da se buni oko svojih faktura i onda ide objasnjavanje i razjasnjavanje koje se u bazu belezi kao delay period. Svaki delay period ima begin date i end date i taj period ne ulazi u krajnji rezultat. Dakle, ako je firmi trebalo 7 dana da plati fakturu, a 3 dana je bio delay period, krajnji rezultat je 4 dana. Tih perioda moze da bude i vise za jednu fakturu i mogu da se preplicu (jedan moze da pocne pre nego se prethodni zavrsi). Ako je placena istog dana, broj dana je 1.
Primer 1: faktura je izdata prvog u mesecu. Od 3. do 7. je jedan delay period, od 5. do 10. je drugi i konacno je placena 15. u mesecu. Broj dana je 3 (od 1. do 3.) + 5 (od 10. do 15.) = 8.
Primer 2: faktura je izdata 1. u mesecu. Od 3. do 6. je jedan delay, od 9. do 12. je drugi. Broj dana: 3 (od 1. do 3.) + 3 (od 6. do 9.) + 3 (od 12. do 15.) = 9
Dakle, treba izracunati broj dana za svaku fakturu (od dana izdavanja do dana placanja), ne racunajuci delay. Potrebno je napisati optimalan SQL kod (T-SQL, mada moze i PL/SQL), tj. stored proceduru. Problem treba da se resi SQL-om jer faktura (i firmi) ima na hiljade i ne moze svaka da se obradjuje posebno van baze.
Ulaz:
(primer)
invoice_nbr......invoice_date.......date_paid.........delay_begin.....delay_end
----------------------------------------------------------------------------------
111111............10/01/2001........10/23/2001.......10/04/2001......10/12/2001
123456............11/01/2001........12/15/2001.......11/20/2001......11/30/2001
123456............11/01/2001........12/15/2001.......11/25/2001......12/05/2001
234567............12/01/2001........12/16/2001.............null................null.......
...
Izlaz:
invoice_nbr......days_to_pay
---------------------------------
111111.................15
123456.................30
234567.................16
...
Postojece resenje nije bas najbolje, pa me zanima da li neko ima bolju ideju (napr. bez kursora u T-SQLu). Hvala unapred.