Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Access - problem sa select upitom

[es] :: Access :: Access - problem sa select upitom

[ Pregleda: 2994 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Dejan Krstic

Član broj: 479
Poruke: 2558



+1 Profil

icon Access - problem sa select upitom21.11.2003. u 11:04 - pre 248 meseci
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).
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Access - problem sa select upitom21.11.2003. u 14:32 - pre 248 meseci
"
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.

:-)











 
Odgovor na temu

Dejan Krstic

Član broj: 479
Poruke: 2558



+1 Profil

icon Re: Access - problem sa select upitom21.11.2003. u 14:58 - pre 248 meseci
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.
 
Odgovor na temu

Deep|Blue
Srce Srbije

Član broj: 631
Poruke: 1431
*.203.EUnet.yu

ICQ: 101830817


+314 Profil

icon Re: Access - problem sa select upitom22.11.2003. u 15:01 - pre 248 meseci
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;

"Hmmm", rekao je, "...suprostavlja se nadrealizmu prikrivene metafore..." Razmišljao je tome na trenutak, a onda je zatvorio beležnicu s mrkim osmehom.
"I smrt je za njih suviše dobra"
 
Odgovor na temu

[es] :: Access :: Access - problem sa select upitom

[ Pregleda: 2994 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.