group by - problem
Student 'Tech.Internetowych' - 01-12-2005 20:33
group by - problem
witam, chialbym odnalesc minimalna cene okreslonego towaru ale wypisac przy tym odpowiedniego importera. Probowalem jak ponizej ale nie dziala - zawsze wypisuje importera1
Czy ktos wskaze co robie zle ? (MySQL)
Pozdrawiam,
create temporary table tmp (ID int not null, importer varchar(10), towar varchar(10), cena double);
insert into tmp values (1,'importer1','towar1',21); insert into tmp values (2,'importer1','towar2',32); insert into tmp values (3,'importer1','towar3',23); insert into tmp values (4,'importer2','towar1',11); insert into tmp values (5,'importer2','towar2',12); insert into tmp values (6,'importer2','towar3',13);
select importer,towar,min(cena) from tmp group by towar;
------
Sergiusz Rozanski - 01-12-2005 20:33
On 2005-11-30, Student 'Tech.Internetowych' <tech1@ux.wsp.krakow.pl> wrote: > insert into tmp values (5,'importer2','towar2',12); > insert into tmp values (6,'importer2','towar3',13); > > > select importer,towar,min(cena) from tmp > group by towar; >
a to aby się nie sypie? group by musi lecieć też po importer, albo na importer musi być agregacja, to warunek działania group by.
więc:
select importer,towar,min(cena) from tmp group by towar, importer;
-- *** rozanski.at.sergiusz.dot.com sq3bkn *** *** http://jeep.comm.pl *** *** rtg project http://gg.overwap.net ***
Pegaz - 01-12-2005 20:33
=?iso-8859-2?Q?por=F3wnanie_ceny_z_cen=B1_minimaln=B1_=3F?=
> witam, chialbym odnalesc minimalna cene okreslonego > towaru ale wypisac przy tym odpowiedniego importera.
pomysł polega na tym aby cenę towaru porównywać z ceną minimalną i jeśli to właśnie ta cena to wypisać importera:
select towar,cena,importer from tmp t1 where cena=(select min(cena) from tmp t2 where t2.towar=t1.towar group by towar)
pozdrawiam Pegaz.
----- Amatorzy zbudowali Arkę, a profesjonaliści Titanic-a.
Student 'Tech.Internetowych' - 01-12-2005 20:33
Sergiusz Rozanski <write-only-with-spf@sergiusz.com> wrote: > On 2005-11-30, Student 'Tech.Internetowych' <tech1@ux.wsp.krakow.pl> wrote: >> insert into tmp values (5,'importer2','towar2',12); >> insert into tmp values (6,'importer2','towar3',13); >> >> >> select importer,towar,min(cena) from tmp >> group by towar; >> > > a to aby si? nie sypie? > group by musi lecie? te? po importer, albo na importer musi by? > agregacja, to warunek dzia?ania group by. > > wi?c: > > select importer,towar,min(cena) from tmp group by towar, importer; > Witaj, dziek za szybka odpowiedz, Niestety takie zapytanie wywala mi wszystkie ceny dla towarow a nie tylko odpowiedz, ze najnizsza cene na towar1 oferuje importer2 itd ...
select importer,towar,min(cena) from tmp group by towar, importer; +-----------+--------+-----------+ | importer | towar | min(cena) | +-----------+--------+-----------+ | importer1 | towar1 | 21 | | importer2 | towar1 | 11 | | importer1 | towar2 | 32 | | importer2 | towar2 | 12 | | importer1 | towar3 | 23 | | importer2 | towar3 | 13 | +-----------+--------+-----------+
Pozdrawiam, Olek
Wojtek pBT (lapt) - 01-12-2005 20:33
Dnia 2005-11-30 09:05, Użytkownik Pegaz napisał:
>>witam, chialbym odnalesc minimalna cene okreslonego >>towaru ale wypisac przy tym odpowiedniego importera. > > > pomysł polega na tym aby cenę towaru porównywać z ceną minimalną i jeśli to > właśnie ta cena to wypisać importera: > > select towar,cena,importer > from tmp t1 > where cena=(select min(cena) from tmp t2 where t2.towar=t1.towar group by > towar)
prawie dobrze ;)
Dam CI to na 2 zapytaniach bez subselektów
1) Wybierasz towary o najniższej cenie
SELECT towarId, min(cena) FROM tab GROUP BY cena;
2) Jeżeli masz już listęnajtańszych towarów, to możesz pobrac importera:
SELECT cena, importer FROM tab WHERE towarId IN( __tu masz wynik z poprzedniego zapytania__)
Tak naprawdę nigdzy jeszcze porządnie nie działałem z podzapytaniami, więc pewnie to co podam niżej da się zrobić dużo lepiej (jeżęli w ogóle jest to poprawne...):
SELECT cena, importer FROM tab WHERE towarId IN(SELECT towarId FROM (SELECT towarId, min(cena) FROM tab GROUP BY cena));
pBT
Sergiusz Rozanski - 01-12-2005 20:33
On 2005-11-30, Wojtek pBT (lapt) <bato3@WirtualanPolskap.pl> wrote: > prawie dobrze ;) > > Dam CI to na 2 zapytaniach bez subselektów > > 1) Wybierasz towary o najniższej cenie > > SELECT towarId, min(cena) FROM tab GROUP BY cena;
to zwraca wszystkie towary
> 2) Jeżeli masz już listęnajtańszych towarów, to możesz pobrac importera: > > SELECT cena, importer FROM tab WHERE towarId IN( __tu masz wynik z > poprzedniego zapytania__)
ponieważ wyższe zwróciło wszystkie towary to to również :)
> Tak naprawdę nigdzy jeszcze porządnie nie działałem z podzapytaniami, > więc pewnie to co podam niżej da się zrobić dużo lepiej (jeżęli w ogóle > jest to poprawne...):
:)
a tak naprawdę to trzeba wybrać _pary_ a nie same towary więc:
select * from tab, (SELECT towarId, min(cena) as cena FROM tab GROUP BY cena) as niskieceny where tab.towarid=niskieceny.towarid and tab.cena=niskieceny.cena
-- *** rozanski.at.sergiusz.dot.com sq3bkn *** *** http://jeep.comm.pl *** *** rtg project http://gg.overwap.net ***
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 01-12-2005 20:34
Sergiusz Rozanski wrote: > select * from tab, > (SELECT towarId, min(cena) as cena > FROM tab GROUP BY cena) as niskieceny > where tab.towarid=niskieceny.towarid and tab.cena=niskieceny.cena
GROUP BY towarId - trzeba patrzyć co się kopiuje! ;)
-- P.M.
Sergiusz Rozanski - 01-12-2005 20:34
Dnia 30.11.2005 Paweł Matejski <madej@spam.madej.pl.eu.org> napisał/a: > Sergiusz Rozanski wrote: >> select * from tab, >> (SELECT towarId, min(cena) as cena >> FROM tab GROUP BY cena) as niskieceny >> where tab.towarid=niskieceny.towarid and tab.cena=niskieceny.cena > > GROUP BY towarId - trzeba patrzyć co się kopiuje! ;)
fakt ;) sorry
-- *** rozanski.at.sergiusz.dot.com sq3bkn *** *** http://jeep.comm.pl *** *** rtg project http://gg.overwap.net ***
Wojtek pBT (lapt) - 01-12-2005 20:34
Dnia 2005-11-30 10:25, Użytkownik Sergiusz Rozanski napisał:
> On 2005-11-30, Wojtek pBT (lapt) <bato3@WirtualanPolskap.pl> wrote: > >>prawie dobrze ;) >> >>Dam CI to na 2 zapytaniach bez subselektów >> >>1) Wybierasz towary o najniższej cenie >> >>SELECT towarId, min(cena) FROM tab GROUP BY cena; > > > to zwraca wszystkie towary
Czepiasz się ;) , już miałem trudności z myśleniem... Miało być GRPUP BY towarID
> select * from tab, > (SELECT towarId, min(cena) as cena > FROM tab GROUP BY cena) as niskieceny > where tab.towarid=niskieceny.towarid and tab.cena=niskieceny.cena > Ten sam błąd ;)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
mysql i mysql-front, problem
String line; if (line=="cos"){...}....problem
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
[postgres] Problem z =?ISO-8859-2?Q?zmian=B1_struktury_i_z?==?ISO-8859-2?Q?ale=BFno=B6ciami=2E?=
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
Problem z wartościami w MySQL :( [ MySQL and ASP and VBScript ]
[PGSQL] czy ktos mial problemy z initdb pgsql 8.1 ?
[MySQL] Problem z zapisem danych w bazie danych
Problem z mysql - can't connect to MySQL/nietypowo...
zanotowane.pldoc.pisz.plpdf.pisz.plptsite.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|