Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Diskuze: Agregační funkce

Ostatní jazyky SQL SQL a databáze Agregační funkce

Aktivity (1)
Avatar
Tomáš Hanzelka:14. listopadu 19:24

Něco mám v mém příkaze špatně. Nedokážu nějak pochytit jak mám zapsat podmínku nebo když musím používat jak having tak where (viz. zadání a obrázek)

Zkusil jsem: select p.Nazev, p.PredmetID from Predmet p
inner join Zapis z on
p.PredmetID = z.PredmetID
where Mistnost like '52%'
group by p.Nazev, p.PredmetID
having COUNT(z.StudentID) >= 1

Chci docílit: Zadání zní: Vypište seznam všech předmětů, které se učí v místnosti „51-107“ nebo je na ně zapsán alespoň 1 student.

 
Odpovědět 14. listopadu 19:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. listopadu 8:33

'Vypište seznam všech předmětů, které se učí v místnosti '
To pracujes s tabulkou kde je jen id_predmet a id_mistnost, rekneme, ze se jmenuje zapisy. Ostatni informace si pridas z dalsich tabulek

SELECT z.id_mistnost, z.id_predmet, z.id_student,
                m.kod AS mist_kod, m.nazev AS mist_nazev,
                p.kod AS pred_kod, p.nazev AS pred_nazev,
                s.jmeno, s.prijmeni
FROM   zapisy z
                 LEFT JOIN mistnosti m ON m.id_mistnost = z.id_mistnost
                 LEFT JOIN predmety  p ON p.id_predmet  = z.id_predmet
                 LEFT JOIN studenti  s ON s.id_student  = z.id_student
WHERE  m.kod='51-107'

zapisy
id_mistnost, id_predmet, id_student
3, 7, 56

mistnosti
id_mistnost, kod, nazev
7, 'b1', 'laborator chemie'

predmety
id_predmet, kod, nazev
3, 'cjl', 'cesky jazyk a literatura'

studenti
id_student, jmeno, prijmeni
56, 'tomas', 'popelka'

Zobrazi to vsechny studenty, kteri jsou zapsani v mistnosti. Takze to pak staci grupovat podle mistnosti a predmetu a odpojit od toho tabulku studenti, protoze te nezajima.

Editováno 15. listopadu 8:35
 
Nahoru Odpovědět 15. listopadu 8:33
Avatar
Tomáš Hanzelka:15. listopadu 10:53

Díky a kde je ta druhá podmínka "nebo je na něj zapsán aspoň jeden student"?
Jak pro lepší komunikaci, první tabulka je tabulka "Predmet", ta pod ní "Zapis".

 
Nahoru Odpovědět 15. listopadu 10:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. listopadu 11:08

Prepokladam, ze princip je takovy, ze studenti s zapisuji do rozvrhu predmety. Student pri zapise vytvori zaznam

zapisy
id_mistnost, id_predmet, id_student
3, 7, 56

Z toho plyne, ze kazdy radek z tabulky zapisy odpovida stavu aspon 1 student.

Ty to delas prave opacne. Ty si oteviras tabulku predmety, kde mas i predmety, ktere nikdo nema zapsane.
Ja si oteviram primo zapsane predmety a a temto zapsanym donacitavam dalsi informace z jinych tabulek pres left join.
Nebo, mas nejaky duvod, proc to delas tak, jak to delas? Zadani od ucitele?

Editováno 15. listopadu 11:08
 
Nahoru Odpovědět 15. listopadu 11:08
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. listopadu 11:19

Ikdyz, mozna to tvoje udela totez, jak tak koukam na tutorialpoint :) INNER JOIN nepouzivam. U LEFT JOIN zalezi na poradi, co k cemu pripojujes. To tam je krasne videt, kdyz tam data bere podle tab. customers a ne podle tab. order, tak je tam spoustu radku s null udaji.
https://www.tutorialspoint.com/…er-joins.htm
https://www.tutorialspoint.com/…ft-joins.htm

 
Nahoru Odpovědět 15. listopadu 11:19
Avatar
plelovsky
Člen
Avatar
plelovsky:15. listopadu 15:57
SELECT p.*
FROM
    Predmet p
    LEFT OUTER JOIN (
           SELECT PredmetID, COUNT(*) AS Pocet
           FROM Zapis
           GROUP BY PredmetID
    ) z ON z.PredmetID = p.PredmetID
WHERE
    p.Mistnost = '51-107'
    OR
    z.Pocet > 0

HAVING tam k ničemu nepotřebuješ.

 
Nahoru Odpovědět 15. listopadu 15:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.