[ rhanival @ 01.09.2015. 22:37 ] @
Molim pomoć oko ovih zadataka... Rješavala sam, ali nisam sigurna da sam dobro riješila. Prvi zadatak možda radi, a drugi ne rade najbolje, najteži je četvrti zadatak. Svaka pomoć je dobro došla! Hvala.

Tablice:
ORG (SIFRA_ORG, NAZIV_ORG, ADRESA)
PUT (SIFRA_PUT, SIFRA_ORG, POLAZISTE, ODREDISTE, PRIJEVOZ, TRAJANJE, CIJENA, PRETHODI)

1. Za svako polazište iz Zagreba prikazati odredište, vrstu prijevoza i naziv organizatora.

SELECT p.odrediste, p.prijevoz, o.naziv_org
FROM org AS o INNER JOIN put AS p
ON o.sifra_org=p.sifra_org
WHERE p.polaziste='Zagreb'

2. Prikazati sve podatke o organizatorima koji imaju barem 3 putovanja koja traju duže od 2 noćenja.

SELECT o.*, COUNT (o.naziv_org) AS broj_putovanja
FROM org AS o INNER JOIN put AS p
ON o.sifra_org=p.sifra_org
WHERE p.trajanje >2
GROUP BY o.naziv_org
HAVING broj_putovanja > 2

3. Koja putovanja su jeftinija od prosječne cijene putovanja po organizatoru?

SELECT p.*
FROM org AS o INNER JOIN put AS p
ON o.sifra_org=p.sifra_org
WHERE p.cijena < (SELECT AVG (p.cijena)
FROM org AS o INNER JOIN put AS p
ON o.sifra_org=p.sifra_org)

4. Prikazati odredište i cijenu svakog putovanja, kao i odredište i cijenu putovanja koju mu neposredno prethodi, za putovanja koja su jeftinija od svojeg prethodnika.

SELECT p.odrediste, p.cijena cijena1, p.cijena cijena2, p.prethodi, p.prethodi
ON o.sifra_org=p.sifra_org
WHERE cijena1 < cijena2

5. Prikazati vrstu prijevoza, trajanje i cijenu za sva ona putovanja koja slijede nakon putovanja brodom u Veneciju.

SELECT p.prijevoz, p.trajanje, p.cijena
FROM put AS p
WHERE p.sifra_put > (SELECT p.sifra_put FROM put AS p
WHERE p.odrediste='Venecija'
AND p.prijevoz='brod')

6. Prikazati trajanje i cijenu onih putovanja koje organizira agencija Atlas, a skuplja su od prosječnog putovanja u Rim.

SELECT p.trajanje, p.cijena
FROM org AS o INNER JOIN put AS p
ON o.sifra_org=p.sifra_org
WHERE o.naziv_org='Atlas'
AND p.cijena > (SELECT AVG (p.cijena)
FROM put AS p
WHERE odrediste='Rim')
[ jablan @ 02.09.2015. 08:57 ] @
Dumpuj ovde neki example dataset pa da se igramo.

http://sqlfiddle.com/
[ rhanival @ 02.09.2015. 18:16 ] @
Evo:
http://sqlfiddle.com/#!9/02568/1
[ jablan @ 02.09.2015. 20:26 ] @
Šta tačno znači polje "prethodi"? Ako putovanja treba hronološki ređati, logičnije je da bude sat i minut polaska. U tom slučaju dva uzastopna polaska dobiješ trostrukim JOIN-om (npr t1, t2, t3), sa uslovom da t1 < t2 < t3 i da je t2 = NULL. To znači da t1 neposredno prethodi t3 (ne postoji nijedan polazak između).
[ rhanival @ 02.09.2015. 21:44 ] @
Može biti da je tako, ovo je slikano sa jednoga ispita... na žalost, zadnji dio tablice se ne vidi pa sam to sama nadodala kako sam mislila da ide, očito je krivo... A što je s ovim drugim SQL upitima? Ne mogu vjerovati da niti jedan ne valja osim ovoga prvoga? Barem da 2 ili 3 budu točna.
[ djoka_l @ 03.09.2015. 20:08 ] @
Mrzim ovu sintaksu sa "INNER JOIN", ali ako su vas tako učili onda ti tako pravi upite. Ali ta sintaksa je i uzrok što ti ne rade neki upiti, recimo onaj pod 2.

1.
Code (sql):

SELECT p.odrediste, p.prijevoz, o.naziv_org
FROM put p, org o
WHERE p.sifra_org = o.sifra_org
AND p.polaziste='Zagreb'

ili sa INNER JOIN sintaksom

SELECT p.odrediste, p.prijevoz, o.naziv_org
FROM put p INNER JOIN org o
ON p.sifra_org = o.sifra_org
WHERE p.polaziste='Zagreb'
 


greška u rešenju drugog zadatka je zato što se onaj WHERE, GROUP BY i HAVING odnosi na ceo upit a ne na ono što je posle join. Dakle,

2.
Code (sql):

SELECT o.*
FROM org AS o INNER JOIN (
   SELECT sifra_org, COUNT(*)
   FROM  put
   WHERE trajanje >2
   GROUP BY sifra_org
   HAVING COUNT(*) > 2 ) AS p
ON o.sifra_org=p.sifra_org
 


(u tvojim testnim podacima ni jedan organizator nema 3 putovanja)

3. Ovde si potpuno promašilia. Zašto radiš join org i put, kada ti org uopšte ne treba?
Mrzi me sada da pišem upite, probaj nešto da poraviš. Ako ne znaš odmah da napraviš ceo upit uradi parcijalno.

4. ovde si promašila čak i sintaksu. ovaj zadatak reši tako što ćeš da uradiš join tabele put sa samom sobom:
select ....
from put as p inner join put as prethodnik
on p.prethodi = prethodnik.sifra_put
....
Ovde nećeš dobiti nikakav rezultat, zato što nisi dobro prepisala polje prethodi u test podacima
[ maksvel @ 30.09.2015. 08:27 ] @
Polupismen sam za SQL, a treba mi nešto što izgleda prosto.
Imam jednu tabelu sa logovima. I tu jedno polje action ima razne vrednosti, a mene interesuje kada je polje loggedin i kada je loggedout. A svaki red ima i userid.
Hteo bih da prebrojim koliko se uz svaki userid pojavljuje loggedin, a koliko loggedout, ali to da mi bude u jednom izlazu. Dakle, kao COUNT, ali obe stvari da budu u istoj tabeli, npr da izlaz izgleda ovako:

userid----loggedin----loggedout
1-----------2-----------1
2-----------1-----------0
4----------12----------5

za svaki id da mi izbaci broj pojavljivanja vrednosti loggedin, ali odmah pored i loggedout.
Kao "dva uporedna count-a"
[ dusans @ 30.09.2015. 08:34 ] @
maksvel, koja baza je u pitanju?
[ maksvel @ 30.09.2015. 08:37 ] @
mySQL
Vidi ovo, npr. jedan count bio bi ovo
SELECT userid, COUNT(action) FROM log WHERE action='loggedin' GROUP BY userid

i ja tu dobijem sve lepo - za jedan count, ali mi treba drugi, isti takav za loggedout, tj. da imam i još kolonu za rezultate tog drugog count-a.
[ dusans @ 30.09.2015. 08:43 ] @
Ne znam kako ide u MySql-u ali znam za MS Sql,
uglavnom umesto COUNT se koristi SUM kada je Action=Nesto, pa evo ti ideje:
Code:

SELECT
    SUM(CASE action WHEN 'loggedin' THEN 1 ELSE 0 END) AS LoginCount,
    SUM(CASE action WHEN 'loggedout' THEN 1 ELSE 0 END) AS LogoutCount
...


Vidim da MySql ima IF funkciju koja ti treba, sličan problem:
http://stackoverflow.com/a/14805910/461810

Dakle, ovako nekako za MySql:
Code:

SELECT
    userid,
    SUM(IF(action = 'loggedin', 1, 0)) AS LoginCount,
    SUM(IF(action = 'loggedout', 1, 0)) AS LogoutCount
FROM log
GROUP BY userid


[ maksvel @ 30.09.2015. 08:52 ] @
Ok, isprobavao sam već nešto ovako, ali mi nije ispalo baš ok, probaću opet, možda sam nešto ispustio.
Ako baš ne uspe, idem kao i inače u životu - kvik end drti - dva upita, pa posle krljam po kodu. Dobro, nije baš kvik, ali drti stoji :)

Hvala

EDIT: OVO fercera izgleda sasvim ok. Dobićeš jedan lajk od mene!

Hvala2