[ Dejan Krstic @ 21.11.2003. 11:04 ] @
Imam bazu "Proizvodi" sledece strukture:


PK, Naziv, Cena, Pocetni_datum.

Pocetni datum predstavlja datum od kada se cena primenjuje. Ukoliko dodje do promene cene ubacuje se novi red sa novom cenom i datumom (onaj stari red se ne sme brisati da bi se znalo koja je cena bila ranije - logicno). Meni treba SELECT upit koji ce da mi da listu proizvoda samo sa trenutnim cenama.

Evo kako sam pokusao i ne radi:

SELECT MAX(Pocetni_datum), Cena, Naziv
FROM Cenovnik
GROUP BY Proizvod_ID;

Kaze: You tried to execute a query that does not include the specified expression <name> as part of an aggregate function. (Error 3122)

Dok ovo radi sasvim lepo:

SELECT MAX(Pocetni_datum)
FROM Cenovnik
GROUP BY Proizvod_ID;

Ali naravno ne daje Naziv i Cenu.

Ne znam koliko se access i sql razlikuju u nekim stvarima ali ja sam prilicno siguran da bi ovo moralo da radi u sql-u (nisam probao).
[ Zidar @ 21.11.2003. 14:32 ] @
"
Evo kako sam pokusao i ne radi:

SELECT MAX(Pocetni_datum), Cena, Naziv
FROM Cenovnik
GROUP BY Proizvod_ID;

Kaze: You tried to execute a query that does not include the specified expression <name> as part of an aggregate function. (Error 3122)

Dok ovo radi sasvim lepo:

SELECT MAX(Pocetni_datum)
FROM Cenovnik
GROUP BY Proizvod_ID;

Ali naravno ne daje Naziv i Cenu.
"

Izraz

SELECT MAX(Pocetni_datum), Cena, Naziv
FROM Cenovnik
GROUP BY Proizvod_ID;

ne radi ni u SQL ni u Accessu. Razlog - polja Cena, NAziv moraju da se pojave u GROUP BY listi. Pravilo je "sva polja koja su u SELCECT listi, a nisu deo agragatnih funkcija (MIN/MAX/AVG itd) moraju da se pojave u GROUP BY listi" Pri tom je dozvoljeno da u GROUP BY listi imas i polja koja se ne pojavljuju u SELECT listi, ali se debelo ne preporucuje. rema tome, tvoj kveri bi trebao da izgleda ovako:

SELECT Proizvod_ID,Cena, Naziv, MAX(Pocetni_datum)
FROM Cenovnik
GROUP BY Proizvod_ID,Cena, Naziv

Ovakav izraz bi se izvrsio i u Accessu i u SQL. Medjutim, ovakav izraz nema mnogo smisla jer bi ti vratio sve rekorde koje imas u tabeli CENOVNIK.

Drugi izraz koji ti radi, treab malo dopuniti, pa umesto ovako

SELECT MAX(Pocetni_datum)
FROM Cenovnik
GROUP BY Proizvod_ID

napisati ga ovako:
SELECT Proizvod_ID, Naziv, MAX(Pocetni_datum)
FROM Cenovnik
GROUP BY vod_ID, Naziv

Ovo ce ti prikazati proizvod i datum poslednje promene cene, ali ne i cenu. Za cenu treba da napises ili jos jedan SELECT, ili da radis "ugnjezdjeni kveri" = subquery.
Jednostavnije je sa dva kverija, evo ovako:

1. Snimi kveri
SELECTProizvod_ID, Naziv, Max(PocetniDatum) AS MaxOfPocetniDatum
FROM Cenovnik
GROUP BY Proizvod_ID, Naziv;
kao qryMaxDatum

2. Napravi novi kveri, ovako:
SELECT Cenovnik.Proizvod_ID, Naziv, Cena, PocetniDatum
FROM Cenovnik
INNER JOIN qryMaxDatum ON (Cenovnik.Proizvod_ID = qryMaxDatum.Proizvod_ID) AND (Cenovnik.PocetniDatum = qryMaxDatum.MaxOfPocetniDatum);
i snimi ga kao qryPoslednjeCene

qryPoslednjeCene daje ti ono sto ti treba - sve proizvode i njihove poslednje cene i datum od kada vaze te cene.

U jednom koraku je malo komplikovanije da se napise ali moze. Ovako:

SELECT
C1.Proizvod_ID, C1.Naziv, C1.Cena, C1.PocetniDatum
FROM Cenovnik AS C1
WHERE C1.PocetniDatum=
(
SELECT MAX(PocetniDatum) FROM Cenovnik AS C2
WHERE C2.Proizvod_ID=C1.Proizvod_ID
)


Testirano na tabeli Cenovnik:
Proizvod_ID Naziv Cena PocetniDatum
1 Jogurt $12.00 10/03/2003
1 jogurt $17.00 15/05/2003
2 Mleko $15.00 12/03/2003
3 Jabuke $95.00 15/04/2003
3 jabuke $116.00 17/06/2003
4 Zejtin $170.00 10/02/2003

Usput, ova tabela ima jedan problem - polja Proizvod_ID i Naziv se pojavljuju u istoj tabeli. Ovo otvara mogucnost gresaka pri unosu. Na primer, za proizvod_ID=1, moze da se unese "Jogurt" ili "Jogurat" i onda ce kveriji da daju pogresan rezultat. Ukoliko je Proizvod_ID jedinstvani identifikator za proizvod, onda Naziv ne treba da stoji u ovoj tabeli uopsete. Naziv i ostale staticne karakteristika proizvoda treba da stoji u zasebnoj tabeli tblProizvodi. Onda se tabele tblProizvodi i Cenovnik povezu relacijom, Proizvod:Cenovnik=1:vise i tvoji podaci su mnogo bezbedniji i otporniji na gresku nego ovako.

:-)











[ Dejan Krstic @ 21.11.2003. 14:58 ] @
Citat:
Usput, ova tabela ima jedan problem - polja Proizvod_ID i Naziv se pojavljuju u istoj tabeli. Ovo otvara mogucnost gresaka pri unosu. Na primer, za proizvod_ID=1, moze da se unese "Jogurt" ili "Jogurat" i onda ce kveriji da daju pogresan rezultat. Ukoliko je Proizvod_ID jedinstvani identifikator za proizvod, onda Naziv ne treba da stoji u ovoj tabeli uopsete. Naziv i ostale staticne karakteristika proizvoda treba da stoji u zasebnoj tabeli tblProizvodi. Onda se tabele tblProizvodi i Cenovnik povezu relacijom, Proizvod:Cenovnik=1:vise i tvoji podaci su mnogo bezbedniji i otporniji na gresku nego ovako.


Znam. Tako je i uradjeno ali nisam hteo da gnjavim pa sam malo uprostio problem :) Inace, hvala puno na odgovoru.
[ Deep|Blue @ 22.11.2003. 15:01 ] @
Citat:
Dejan Krstic:
...
SELECT MAX(Pocetni_datum), Cena, Naziv
FROM Cenovnik
GROUP BY Proizvod_ID;

Kaze: You tried to execute a query that does not include the specified expression <name> as part of an aggregate function. (Error 3122)

Dok ovo radi sasvim lepo:

SELECT MAX(Pocetni_datum)
FROM Cenovnik
GROUP BY Proizvod_ID;
...


kada koristis agregatne funkcije u sql select iskazima moras da navedes sva ne-agregatna polja u Group By delu, tj. svako polje koje selektujes bez agregatne funkcije mora biti navedeno u group by delu.

u tvom primeru bilo bi

SELECT MAX(Pocetni_datum), Cena, Naziv
FROM Cenovnik
GROUP BY Proizvod_ID, Cena, Naziv;