meni se cini da ovde imamo posla sa fiksnim mesecnim uplatnicama. Za svaki mesec, izda se jedna uplatnica. Ona se ili plati ili ne plati. Proizilazi da se moze platiti samo onoliki iznos koliki je na uplatnici, ni vise ni manje. Samo tako ima smisla polje 'Placen', sa znacenjem 'datum kad je ova uplatnica placena'. Ako je NULL, znaci da doticna uplatnica nije placena.
To zakljucujem iz primara tabele koji je dat u pocetnom postu:
Code:
id, mesec, pretplatnik, iznos, placeno
1, 2007-01-01, 1, 500, "2007-03-20"
2, 2007-02-01, 1, 500, ""
3, 2007-03-01, 1, 500, ""
4, 2007-04-01, 1, 500, ""
5, 2007-05-01, 1, 500, ""
i objasnjenja iz drugog posta
Citat:
Svaki mesec zaduzujem pretplatnika, svaki mesec stampa racun za odredjeni mesec, a zaostali dug je suma od neplacenih prethodnih meseca.
Ako govorimo o palcenim uplatnicama (Racunima), sve sto mozemo da uradimo jeste da za dati mesec prebrojimo koliko je bilo uplatnica (zaduzenja) zakljucno sa tim mesecom, i koliko njih je placeno ili nije placeno.
Datum placanja izgleda potpuno nebitan, jer mi se cini da se uplatnice mogu placati bilo kojim redom. Na primer:
Code:
id, mesec, pretplatnik, iznos, placeno
1, 2007-01-01, 1, 500, "2007-03-20"
2, 2007-02-01, 1, 500, "2007-02-15"
3, 2007-03-01, 1, 500, "2007-03-20"
4, 2007-04-01, 1, 500, ""
5, 2007-05-01, 1, 500, ""
Ovde se vidi da pretplatnik nije platio januarsku uplatnicu na vreme, pa je februarsku platio 15 Feb, a onda je u martu platio i martovsku i januarsku istog dana, 20 marta. Ovo ne bi trebalo da bude nemoguce, zar ne?
Predlazem kveri koji prikazuje kumulativno zaduzenje zakljucno sa mesecom i kumulativni broj (COUNT) placenih uplatnica koje su izdate zakljucno sa mesecom. Nesto ovako:
Code:
SELECT
Pretplatnik
, BrojIzadtihRacuna = (SELECT COUNT(*) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec )
, KumulativnoZaduzenje = (SELECT SUM(Iznos) FROM Pretplata AS B WHERE B.Mesec <= A.Mesec)
, BrojPlacenihRacuna = (SELECT COUNT(*) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NOT NULL)
, KumulativnoPlaceno = (SELECT SUM(Iznos) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NOT NULL)
, BrojNeplacenih = (SELECT COUNT(*) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NULL)
, IZnosDuga = (SELECT SUM(Iznos) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NULL)
FROM Pretplata AS A
GROUP BY Pretplatnik
Ovaj kveri daje lepu sliku u nekom zadatom trenutku. I nema mesec u WHERE, pa se moze koristiti kao view koji ce biti osnova za report (SELCt * FROM view WHERE mesec=...)
Ako se zeli prikazatii vise podataka o korisniku, a ne samo ID, onda probaj dodati JOIN, otprilike ovako:
Code:
SELECT
Pretplatnik
, Ime = MAX(P.ImePretplatnika)
, Prezime = MAX(P.Prezimepretplatnika)
, Adresa = MAX(P.Adresa)
, BrojIzadtihRacuna = (SELECT COUNT(*) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec )
, KumulativnoZaduzenje = (SELECT SUM(Iznos) FROM Pretplata AS B WHERE B.Mesec <= A.Mesec)
, BrojPlacenihRacuna = (SELECT COUNT(*) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NOT NULL)
, KumulativnoPlaceno = (SELECT SUM(Iznos) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NOT NULL)
, BrojNeplacenih = (SELECT COUNT(*) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NULL)
, IZnosDuga = (SELECT SUM(Iznos) FROM Pretplata AS B WHERE WHERE B.Mesec <= A.Mesec
AND B.Placeno IS NULL)
FROM Pretplata AS A
JOIN Pretplatnici AS P ON P.Pretplatnik = A.pretplatnik
GROUP BY Pretplatnik
MAX je upotrebljeno da ne bi morali u GROUP BY da ubacimo Ime, prezime i Adresu
Medjutim, meni je cela logika klimava. Ako korisnik izgubi uplatnicu, kako ce da plati? Zasto se ne moze uplatiti iznos razlict od onoga koji je na racunu? Placam koliko mogu i kad mogu? Posto je logika klimava, stalno imas probleme sa sastavljanjem dobrog kverija koji prikazuje sta se u stvari desilo. Losa logika => los dizajn baze => tesko se izvlace podaci (tesko se i unose)
:-)