"DWH i u posebnoj bazi napravim tabelu prodaje, u kojoj su izmedju ostalog i polja datum i sifra_robe"
Za ovaj problem imas generalno dve opcije:
A) normalizovane tabele, cena se pamti samo u tabeli Cenovnik
Code:
Cenovnik (Sifra_robe varchar(5) , Cena decimal, DatumVazenjaCene datetime)
Prodaja (Prodaja_ID int , Sifra_Robe varchar(5), Kolicina decimal, DatumProdaje datetime)
Onda ti za prikaz cene robe na dan prodaje moze posluziti ovakav kveri:
Code:
SELECT P.Prodaja_ID
, P.Sifra_Robe
, P.Kolicina
, P.DatumProdaje
, CenaNaDanProdaje =
(SELECT C.Cena
FROM Cenovnik AS C
WHERE C.Sifra_robe = P.Sifra_Robe
AND C.DatumVazenjaCene =
(SELECT MAX( DatumVazenjaCene )
FROM Cenovnik AS C2
WHERE C2.Sifra_Robe = C.Sifra_Robe
AND C2.DatumVazenjaCene <= P.Datumprodaje
)
)
FROM Prodaja AS P
ORDER BY P.Sifra_Robe
, P.DatumProdaje
To je nesto slicno onome sto si ti napisao i provereno - radi. Iz strukture ovog kverija mozes da zakljucis koji bi ti indeksi bili od koristi.
Medjutim, u praksi malo ko radi na ovaj nacin. Uglavnom se korsiti druga varijanta, gde se cena na dan prodaje kopira iz tabele Cenovnik u tabelu prodaja. Sve je isto, samo tabela Prodaja ima jednu kolonu vise:
B) Denormalizovano resenja:
Code:
Cenovnik (Sifra_robe varchar(5) , Cena decimal, DatumVazenjaCene datetime)
Prodaja (Prodaja_ID int , Sifra_Robe varchar(5), Kolicina decimal, DatumProdaje datetime, cenaNaDanprodaje decimal)
Onda pre nego sto uradis INSERT u tabelu Prodaja moras da pronadjes trenutno vazecu cenu. Za to mozes da upotrebis svoj kveri ili iz prethodnog slucaja nesto ovako:
Code:
SELECT CenaNaDanProdaje =
(SELECT C.Cena
FROM Cenovnik AS C
WHERE C.Sifra_robe = 'JAB'
AND C.DatumVazenjaCene =
(SELECT MAX( DatumVazenjaCene )
FROM Cenovnik AS C2
WHERE C2.Sifra_Robe = 'JAB'
AND C2.DatumVazenjaCene <= 'DatumProdaje'
)
Server ima da radi vise pri insertu, ali zato vise nema potrebe za komplikovanim kverijima.
Posto pominjes DWH (valjd je to data Warhouse), onda se seti da u DWH ne mora bas sve da bude normalizovano i da je redundansa u podacima pozeljna, e da bi se pretrazivanje i prikaz podataka ubrzali. Za potrebe DWH se cak i agregatni podaci (SUM(Kolicina*CENA) GROUP BY Sifra_Robe, Godina) cesto unapred izracunaju i tako izracunati cuvaju u DWH.
:-)