Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: SQL příkazy pro mou databázi v MySQL

Aktivity (1)
Avatar
James T
Člen
Avatar
James T:25. dubna 22:12

Dobrý večer. Prosím o rady. Schéma mé databáze je v obrázku.
Nenapadá mě jak napsat SQL příkazy pro tyto případy:

  1. Chci docílit pracovní doby zaměstnance ve třech sloupečcích -

např. Jan | Novák | pondělí, úterý, středa

  1. Zjištění přesčasů / podčasů zaměstnanců. Když například jeden zaměstnanec přijde 1.1.2019 8:00 pak odejde na oběd ve 12:00, pak zase přijde píchne si příchod, pak si pípne odchod k lékaři, pak zase přijde pípne si příchod a pak v 16:00 si pípne odchod domů.

Mám zaměstnance v mé databázi (viz. obrázek) a někteří pracují od pondělí do středy, a jiní pouze ve čtvrtek a pátek a můžou mít více příchodů a odchodů v tabulce průchod v jeden den.

Zkusil jsem:

  1. Mě nic nenapadá ani SQL příkaz.
  2. Napadá mě jedině cca tento slovní postup.

datum_a_cas v tabulce Pruchod oříznout nějakou agregační funkcí a získat jenom TIME a ten TIME při id_duvod 2 (odchod) nebo id_duvod 3 (odchod k lékaři) nebo id_duvod 4 (ostatní) odečíst TIME (získaný z datum_a_cas) při id_duvod 1 (příchod)
a od toho celého potom odečíst (cas_do mínus cas_od v tabulce ocekavana_prac_doba )

Chci docílit:

  1. Chci docílit pracovní doby zaměstnance ve třech sloupečcích (značka sloupce je | )

Jan | Novák | pondělí, úterý, středa

  1. Zjištění přesčasů / podčasů zaměstnanců
Editováno 25. dubna 22:15
 
Odpovědět 25. dubna 22:12
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26. dubna 8:22

Z toho, co jsi popsal textem, co presne ti nejde, co to da za data a jaka mela byt?
Jan | Novák = SELECT jmeno, prijmeni FROM osoby
pondělí, úterý, středa = SELECT prichod, odchod FROM prichody
a propojene to mas jiste vazebni tabulkou osoby_zamestnanci zam_prichody. Pseudokod:

SELECT sloupce, 1 AS den, id_zam FROM prichody LEFT JOIN osoby_zamestnanci, zam_prichody, osoby... GROUP BY id_zamestnanec WHERE den=pondeli

SELECT sloupce, JOIN(den) FROM(
(SELECT ...1 AS den... den=pondeli) UNION ALL
(SELECT ...2 AS den... den=utery) UNION ALL
(SELECT ...3 AS den... den=streda)
)
GROUP BY id_zam, den

Preci, postupujes logicky. Vis jaka data potrebujes na vstupu. Kde je mas hledat.
Vyhledas vse, co se jen da, na elementarni urovni, a pak to zacnes spojovat. Podstatne je, ze pokud budes groupovat nad unionem, tak by to melo byt co nejmene radku, sloupcu a pouzivat tam idecka. Ostatni data muzes pridat az do vysledne tabulky left joinem. Respektive, ty data, ktera nespadaji do tabulek pouzitych uvnitr unionu a nemaji vliv na SELECT nad uniony. Jakoze pro vnejsi SELECT-GROUP potrebujes jen den a id_zam. Vse ostatni je pritez. Ale pokud uz mas ty tabulky otevrene... Pozor ale na sloupce pro group by a where. Tam je dobre pouzit indexovana data.

 
Nahoru Odpovědět 26. dubna 8:22
Avatar
James T
Člen
Avatar
James T:26. dubna 18:22

Relační schéma je v příloze. Je správně navrženo do 3. NF?

 
Nahoru Odpovědět 26. dubna 18:22
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 3 zpráv z 3.