Databáze jako informační zdroj pro uživatele

Transkript

Databáze jako informační zdroj pro uživatele
Databáze jako informační zdroj pro uživatele
Helena Palovská
Vysoká škola ekonomická
Praha 2004
OBSAH
O TĚCHTO SKRIPTECH
5
Instalace řešení
5
1
ÚVODNÍ SLOVO A DATABÁZÍCH
6
2
SEZNÁMENÍ SE VZOROVOU DATABÁZÍ NORTHWIND
7
2.1
Vysvětlení kontextu a významu dat
7
2.2
Tabulky databáze Northwind
8
2.3
Schéma databáze Northwind
9
2.4
Struktura tabulek v databázi Northwind
2.4.1
Vysvětlení k některým polím v databázi Northwind
10
11
2.5
Formuláře
11
2.6
Pochopení dat
11
3
3.1
PŘÍPRAVA NÁSTROJE K PROCVIČOVÁNÍ ÚLOH
K čemu slouží relace ve vašem projektu?
12
14
3.2
Dotazy Rozšířené podrobnosti objednávek a Mezisoučty objednávek
3.2.1
Úprava dotazu Rozšířené podrobnosti objednávek
14
15
3.3
15
4
Kopie vzorových řešení
JEDNODUCHÉ DOTAZY
16
4.1
První jednoduchý dotaz
4.1.1
Řazení v návrhu dotazu
4.1.2
Co je dotaz
4.1.3
Úpravy v datovém listu odpovědi
4.1.4
Kritéria v návrhu dotazu
16
18
19
19
19
4.2
Kritéria v dotazu
20
4.3
Jedinečné hodnoty
21
4.4
Výrazy v dotazu
4.4.1
Formát a zobrazení pole v dotazu
4.4.2
Tvůrce výrazů
4.4.3
Lupa
21
22
22
23
4.5
Jak používat průvodce jednoduchým dotazem
23
4.6
Dotaz v návrhovém zobrazení
24
4.7
Přidávání tabulek do návrhu dotazu
25
4.8
Nejvyšší hodnoty
26
4.9
Dotazy s parametry
26
5
SESKUPOVACÍ DOTAZY
27
5.1
Co jsou seskupovací dotazy?
27
5.2
První seskupovací dotaz
28
5.3
Agregační funkce
30
5.4
Průvodce pro souhrnný dotaz
30
5.5
Count v seskupovacím dotazu
31
5.6
Doporučení pro použití průvodce
32
5.7
Omezení počtu řádků výsledku seskupovacího dotazu
32
5.8
Křížové dotazy
5.8.1
Pole křížového dotazu
5.8.2
Datový list křížového dotazu
33
35
35
5.9
Kontingenční tabulky, kontingenční grafy
5.9.1
Kontingenční grafy
36
37
5.10
Zvláštní případy seskupovacích úloh
5.10.1
Dotazy na počet různých hodnot
5.10.2
Agregace First, Last
38
38
39
6
SOUHRNY POMOCÍ DATOVÝCH KOSTEK
42
6.1
Datová kostka z dat Northwind
42
6.2
Jiná kostka z Northwind
44
7
PŘEHLEDY A SOUHRNY JEŠTĚ JINAK
45
8
MEZIVÝSLEDKY
47
8.1
Příklad propojení mezivýsledků
47
8.2
Mezivýsledek pro použití v kritériu
50
8.3
Skalární pod-dotazy
8.3.1
Alternativa pomocí více mezivýsledků
8.3.2
SQL SELECT jako výraz pro pole dotazu
9
DOTAZY NA TO CO V DATABÁZI NENÍ
52
52
53
54
9.1
Alternativní řešení
55
10
POLOSPOJENÍ
56
11
SELF JOIN
60
12
SESTAVY
62
12.1
Automatické sestavy
62
12.2
Průvodce sestavou
62
12.3
Podsestavy
12.3.1
Grafy
67
68
12.4
Parametry
12.4.1
Parametry v podsestavách
68
69
12.5
Obrázky v sestavě
69
13
AKČNÍ DOTAZY
13.1
Vytvářecí dotazy
70
13.2
Přidávací dotazy
70
13.3
Odstraňovací dotazy
72
13.4
Aktualizační dotazy
73
14
CVIČENÍ
14.1
Jednoduché dotazy
70
76
76
14.2
Dotazy se souhrny
14.2.1
Křížové dotazy
14.2.2
Výběr podle vypočteného souhrnu
14.2.3
Souhrny pro celou tabulku
14.2.4
Spojení několika souhrnů
14.2.5
Agregační funkce pro čas
14.2.6
Počet různých hodnot
76
77
78
78
78
79
79
14.3
Kritérium propojením
79
14.4
Řešení cvičení
80
15
TÉMATICKY ZAMĚŘENÉ ÚLOHY
15.1
Výjimky a závislosti
85
15.2
Zaměření zaměstnanců
85
15.3
Tendence nákupů
85
15.4
Průběh cen
85
15.5
Porovnání charakteristik
86
REJSTŘÍK
85
87
O těchto skriptech
Cílem těchto skript je naučit uživatele používat databázi jako informační zdroj, použité nástroje jsou
ze sady MS Office, ale znalosti zde získané poslouží i při použití jiných uživatelských nástrojů.
Hlavními prostředky pro uživatele k získávání nestandardních informací, tj. navíc nad předem
připravené výstupy informačního systému, jsou dotazy a tiskové sestavy. Ty jsou také hlavní náplní
těchto skript. Rutinní postupy práce, jež jsou velmi dobře popsány a vysvětleny v nápovědě
programů MS Office, zde nejsou vykládány. Téma každé kapitoly je nejprve uvedeno popisem
jednoduchého příkladu „krok za krokem“, dále se výklad soustředí spíše na naznačení dalších cest
k dosažení cílů a na vysvětlení účelu. Pouze některé postupy jsou zde podány „krok za krokem“.
Tato skripta jsou určena jak pro počítačově gramotné začátečníky, tak i pro středně pokročilé
uživatele. Proto je text doplněn poznámkami rozšiřujícími základní výklad, ty jsou buď ve formě
textu drobným písmem nebo jako poznámky pod čarou. Pouze některé poznámky pod čarou slouží
jako nápověda pro nějaký rutinní postup.
K výkladu je použit program MS Access 2002, některé speciální úkoly jsou řešeny pomocí
programu MS Excel 2002 a některých jeho dodatečných modulů.
Ke standardní instalaci programu MS Access patří vzorová databáze Northwind. Tato vzorová
databáze je používána v příkladech k procvičení. Ve verzi MS Access2002 je standardně
instalována do složky C:\Program Files\Microsoft Office\Office10\Samples\.
Ke skriptům patří také vzorová řešení úloh 1 dostupná na internetové adrese
nb.vse.cz/~palovska/uzida/
Zde vyberte svou verzi programu MS Access a stáhněte si zip-soubor. Tento zip-soubor rozbalte do
složky
C:\Uživatel databází\
Vzorové řešení předpokládá umístění databáze Northwind ve standardní složce. Pokud máte
databázi Northwind umístěnou jinde, musíte si řešení instalovat podle návodu „Instalace řešení“
níže.
K práci na úlohách a cvičeních doporučuji připravit si vlastní projekt programu MS Access, návod
naleznete v kapitole 3 Příprava nástroje k procvičování úloh.
Instalace řešení
Instalaci vzorových řešení úloh nemusíte upravovat, pokud máte vzorovou databázi Northwind
umístěnou ve standardní složce C:\Program Files\Microsoft Office\Office10\Samples\ . Pokud tomu
tak není, postupujte následujícím způsobem.
Odstraňte atribut „jen pro čtení“ souboru C:\Uživatel databází\Řešení.mdb , potom
tento soubor otevřte. V menu zvolte Nástroje – Správa databáze – Správce propojených tabulek.
V dialogu „Správce propojených tabulek“ zaškrtněte vše kromě „Intervaly“ a „Ceny“a potom
stiskněte OK. V následujícím dialogu „Vyberte nové umístění pro Dodavatelé“ nalezněte vaši
databázi Northwind. Dostanete zprávu o úspěšném obnovení propojení tabulek, tu potvrďte. Zavřete
okno programu MS Access. Nastavte atribut „jen pro čtení“ souboru C:\Uživatel
databází\Řešení.mdb .
1
Vzorová řešení jsou dostupná také při výuce kurzů, pro něž jsou tato skripta určena.
5
1 Úvodní slovo a databázích
Naprostá většina databází, se kterými se dnes můžete setkat, jsou databáze tzv. relační 2. To
znamená, že data v nich jsou uspořádána do tabulek.
Jedna tabulka v relační databázi běžně obsahuje data o věcech jednoho druhu, například můžeme
mít tabulku Výrobky obsahující data o jednotlivých výrobkách. To znamená, že jednotlivé řádky
této tabulky představují záznamy o jednotlivých výrobkách.
Sloupce tabulek v relační databázi se nazývají pole, mají jméno, a představují jednotlivé hodnoty,
do nichž jsou záznamy v dané tabulce rozděleny. V tabulce Výrobky tak můžeme mít pole
„NázevVýrobku“, „JednotkováCena“, „JednotkyNaSkladě“ a pod. Každé pole tabulky má kromě
jména a významu také určen tzv. datový typ – pole NázevVýrobku bude mít datový typ „text
maximální délky 40 znaků“, pole JednotkováCena bude mít datový typ „měna“ (v konkrétní
databázi 3 to může znamenat číslo s maximálně 15ti ciframi před desetinnou čárkou a maximálně
4mi ciframi za desetinnou čárkou, se kterým se nepočítá jako se zaokrouhleným reálným číslem),
pole JednotkyNaSkladě bude mít datový typ „malé celé číslo“ (v konkrétní databázi to může
znamenat rozsah od – 32 768 do + 32 768, tj. 2byte v binárním kódování čísla). Dalšími často
používanými datovými typy, kromě „text zvolené maximální délky“ a „číslo zvolené přesnosti“,
jsou „datum“ a „ano/ne“. Moderní relační databáze nabízejí také datové typy pro ukládání delších
textů proměnné délky, datové typy pro obrázky, pro zvuky apod.
Tabulky v databázi mívají obvykle tzv. klíč – klíč tabulky je skupina polí v této tabulce, podle níž
lze jednotlivé záznamy jednoznačně identifikovat. Většinou jde o jediné pole 4. V případě tabulky
Výrobky může být jejím klíčem např. pole ČísloVýrobku – klíče jsou často uměle vytvořené
identifikační kódy pro účely organizace databáze.
2
Název pochází od matematického pojmu „relace“, jejž v roce 1969 použil pan E.F.Codd jako základní představu pro
organizaci dat v databázi – matematickou relaci lze mimo jiné zapsat jako tabulku. Představa, že tabulka, jejíž řádky
představují záznamy o objektech v realitě, je matematickou relací, se však může jevit poněkud absurdní. Pouze
v případě, že tabulka relační databáze zaznamenává vztah mezi objekty světa, je její chápání jako matematické relace
rozumné. Pojem relace používaný v MS Access (viz str. 9) i v některých jiných programech pro správu dat je však něco
docela jiného, zde jde o skutečný vztah mezi objekty.
3
Takto to je v SŘBD MS Access. K tomuto datovému typu zde patří i formátová vlastnost, že hodnoty jsou
zobrazovány se znakem národní měny, např. Kč nebo €.
4
Ne však vždy, ve vzorové databázi má tabulka Rozpis objednávek klíč složený ze dvou polí.
6
2 Seznámení se vzorovou databází Northwind
2.1 Vysvětlení kontextu a významu dat
Databáze Northwind obsahuje data o následujícím obchodním kontextu (viz též orientační obrázek
níže):
Dodavatelé dodávají výrobky, které nabízíme svým zákazníkům. Výrobky máme roztříděny do
kategorií. O výrobkách máme běžné katalogové a skladové záznamy, kromě jiného také aktuální
jednotkovou cenu.
Naši zákazníci podávají objednávky, v nichž objednávají vybrané výrobky ve zvoleném množství,
navíc mohou v dané objednávce pro daný druh výrobku získat slevu. U každého objednání nějakého
výrobku v nějaké objednávce máme tedy vždy zaznamenáno množství objednaných kusů tohoto
výrobku v dané objednávce, dohodnutou procentuelní slevu pro tento výrobek v dané objednávce, a
cenu výrobku platnou v době objednání, protože aktuální cena výrobku se může měnit.
Zákazníci i dodavatelé jsou smluvní partneři 5, o kterých si vedeme záznamy: u každého máme
kromě jména firmy a adresy také jméno kontaktní osoby a funkci této osoby v partnerské firmě.
U některých dodavatelů máme navíc poznamenáno URL domovské stránky.
Každou objednávku přijímá nějaký náš zaměstnanec. O zaměstnancích máme zaznamenány
personální údaje, dále máme u všech, kromě nejvyššího šéfa, zapsáno kdo je jejich nadřízený.
patří do
DRUH VÝROBKU
ČísloVýrobku
NázevVýrobku
MnožstvíVJednotce
JednotkováCena
PočetKsNaSkladě
ObjednánoKs
MinimálníÚroveňKs
NákupUkončen
KATEGORIE
ČísloKategorie
NázevKategorie
Popis
Obrázek
u .. máme
KONTAKTNÍ OSOBA
JménoAPříjmení
FunkceKontaktníOsoby
je
dodává
je objednán v
PočetKs
CenaZaKs
Sleva
ZAMĚSTNANEC
ČísloZaměstnance
Příjmení
Jméno
FunkceZaměstnance
FormálníOslovení
DatumNarození
ZaměstnánOd
Adresa
TelefonDomů
Linka
Foto
Poznámky
SMLUVNÍ PARTNER
JménoFirmy
Adresa
Telefon
[Fax]
je
DODAVATEL
ČísloDodavatele
[DomovskáStránka]
OBJEDNÁVKA
ČísloObjednávky
DatumObjednávky
DodatDne
DatumOdeslání
podává
přebírá
ZÁKAZNÍK
KódZákazníka
PŘÍJEMCE
JménoPříjemce
Adresa
přepravuje
přijímá
Dopravné
podřízený
má nadřízeného
nadřízený
PŘEPRAVCE
ČísloPřepravce
JménoFirmy
Telefon
Rozvětvené zakončení znamená „eventuelně více“, například: „Dodavatel dodává eventuelně více
druhů výrobků“ , „Druh výrobku je objednán v eventuelně více objednávkách“ , „Objednávka
objednává eventuelně více druhů výrobků“
Zakončení bez rozvětvení znamená „jediným/jediného“, například: “Druh výrobku je dodáván
jediným dodavatelem“, “Zaměstnanec má jediného nadřízeného“, „U smluvního partnera máme
jedinou kontaktní osobu“
Připojení přerušovanou čarou znamená „nemusí“, například: „Zákazník nemusí podávat
objednávku“„Zaměstnanec nemusí mít nadřízeného zaměstnance“, „Zaměstnanec nemusí být
nadřízeným nějakého zaměstnance“,„Objednávka nemusí být předána nějakému příjemci (tzn. jinému
než je zákazník)“
Pro každou objednávku je sjednán některý náš smluvní přepravce, jenž má zboží přepravit, a je
dohodnuto a zaznamenáno dopravné.
5
Později zjistíme, že v databázi Northwind je jedna tabulka Zákazníci a jedna tabulka Dodavatelé, smluvní partneři jsou
tedy rozděleni do těchto dvou tabulek.
7
Objednávka je běžně zasílána na jméno firmy zákazníka a jeho adresu, ale může mít určeného
jiného příjemce, který ji má převzít. Ti nás ovšem zajímají pouze tehdy, když mají převzít nějakou
objednávku.
Zákazníci nás oproti tomu zajímají i tehdy, když žádnou jejich objednávku momentálně nemáme.
Podobně si ponecháváme záznamy o přepravcích, zaměstnancích, výrobkách i v případě, že
bychom neměli žádné s nimi spojené objednávky. Taktéž v případě dodavatelů, kteří by
momentálně nedodávali žádné výrobky.
Ostatní lépe pochopíte prohlížením tabulek v databázi Northwind.
2.2 Tabulky databáze Northwind
Nalezněte a spusťte vzorovou databázi Northwind. Otevře se okno programu MS Access a v něm
úvodní dialog této vzorové databáze. Tento úvodní dialog vás informuje, že vzorová databáze je
výuková, že všechno v ní si lze do detailů prohlédnout. 6
Úvodní dialog zavřete tlačítkem OK, objeví se Hlavní panel. Protože tato skripta jsou určena
uživatelům spíše než programátorům, není tento dialog pro nás zajímavý, je to vzor řídícího dialogu
ukázkové databázové aplikace. Můžete si sice pomocí něho prohlédnout nabízené formuláře pro
kategorie výrobků, pro výrobky, pro dodavatele nebo pro objednávky, dále je nabízen seznam
vzorových tiskových sestav, ale toto vše si lze prohlédnout i později z okna databáze Northwind.
Takže i tento Hlavní panel nakonec uzavřeme, a konečně vidíme standardní interface programu
MS Access s oknem otevřené databáze.
Okno databáze má vlevo přepínače typu objektů, které chceme vidět a eventuelně s nimi pracovat:
tabulky, dotazy, formuláře, sestavy, stránky, makra, moduly. To všechno jsou objekty, které může
databáze programu MS Access obsahovat, a vzorová databáze Northwind také obsahuje ukázky
všech těchto typů objektů. Ale v našem kurzu budeme pouze potřebovat porozumět tabulkám a
naučit se pracovat s dotazy a sestavami. Pro porozumění datům vzorové databáze ještě použijeme
vzorové formuláře Dodavatelé, Kategorie, Objednávky, Výrobky, Zákazníci a Zaměstnanci.
Nejprve se seznámíme s tabulkami. Přepněte na seznam tabulek, v okně databáze si přepněte na
zobrazení podrobností
. Uvidíte popis jednotlivých tabulek:
Některé tabulky jsou snadné k pochopení, něco vysvětlíme. Tabulka Výrobky popisuje druhy
výrobků. Smluvní partneři jsou rozděleni do tabulek Zákazníci a Dodavatelé, údaje o kontaktních
osobách u smluvních partnerů jsou součástí záznamů v tabulkách Zákazníci a Dodavatelé. Tabulka
Rozpis objednávek obsahuje detailní záznamy o jednotlivých objednáních jednotlivých druhů
6
Prohlížejte, ale nic neměňte. Pokud máte náhodou soubor Northwind.mdb přístupný k zápisu a ne pouze ke čtení,
doporučuji pro jistotu změnit vlastnosti tohoto souboru na „pouze ke čtení“.
8
výrobků v jednotlivých objednávkách, prohlédneme si to. Otevřete 7 tabulku Objednávky, a rozviňte
v několika řádcích detaily stisknutím + před řádkem:
Vnořené malé tabulky představují to, co dohromady tvoří tabulku Rozpis objednávek. V té je
ovšem ještě údaj o tom, ke které objednávce co patří. Po prohlédnutí můžete zavřít okno
„Objednávky“, pak si můžete prohlédnout7 i samotnou tabulku Rozpis objednávek.)
2.3 Schéma databáze Northwind
8
Prohlédneme si schéma databáze. Stisknutím tlačítka Relace
v panelu nástrojů se otevře okno
„Relace“. V něm je pro každou tabulku databáze zobrazeno jedno malé okénko se seznamem polí
této tabulky. Okna „Deset nejdražších výrobků“ si nevšímejte, pro nás není k ničemu.
Protože objednávku podává jediný zákazník, přijímá jediný zaměstnanec, přepravuje jediný
přepravce a přijímá jediný příjemce, jsou údaje o těchto faktech součástí záznamu o objednávce,
tabulka Objednávky má pro ně odpovídající pole. (Pokud objednávku přebírá zákazník a ne jiný
příjemce, jsou v záznamu objednávky v polích určených pro příjemce zopakovány údaje o
zákazníkovi.)
Všechny adresy jsou rozděleny do složek „Adresa“, „Město“, „Region“, „PSČ“, „Země“.
Údaj o nadřízeném zaměstnanci je součástí záznamu o zaměstnanci, v poli „Nadřízený“.
Údaj o dodavateli výrobku je součástí záznamu o výrobku, v poli „ČísloDodavatele“, podobně je
tomu s kategorií výrobku.
Čáry spojující dvojice tabulek značí tzv. relace. Ty mají několik významů, vzájemně souvisejících.
První a hlavní význam je ten, že čára spojuje to co máme spolu spojovat: v tabulce Objednávky je
7
„Otevření“ tabulky docílíme poklepáním na tabulku v seznamu, nebo pomocí tlačítka
otevře tzv. datový list tabulky.
8
Je dosažitelné pouze pokud je aktivní okno Databáze.
9
. Ve skutečnosti se tak
v poli KódZákazníka uveden kód zákazníka, který ji podal, tohoto zákazníka najdeme v tabulce
Zákazníci podle shodné hodnoty v poli, jež se také jmenuje KódZákazníka. Podobně je tomu s poli
ČísloZaměstance v Objednávkách i v Zaměstnancích: v tabulce Objednávky je uvedeno číslo
zaměstnance, který ji přijal. – Překvapivě zjišťujeme, že pole, které obsahuje číslo přepravce, který
je sjednán pro přepravu objednávky, se v tabulce Objednávky jmenuje „Přeprava“. I to se v reálné
databázi může stát, že spolu související pole se jmenují jinak.
Tučně jsou vyznačeny klíče tabulek.
V souvislosti s klíči mají relace většinou ještě další význam: spojují vždy klíč v jedné z tabulek s tzv. cizím
klíčem v druhé tabulce: např. pole ČísloKategorie v tabulce Výrobky je v této tabulce cizím klíčem, spojeným
s klíčem tabulky Kategorie. Proto jsou na koncích čar zobrazujících relace znaky 1 a ∞ . V našem případě
tabulek Kategorie a Výrobky to znamená, že každý jednotlivý výrobek patří do jediné kategorie, zatímco
do jednotlivé kategorie patří eventuelně více výrobků. Podobně je tomu v ostatních případech relací mezi
tabulkami.
Zvláštní pozornost zasluhuje tabulka Rozpis objednávek. V ní jsou dva cizí klíče: pole ČísloObjednávky a pole
ČísloVýrobku jsou v ní obě cizími klíči, jsou spojeny s klíči tabulek Objednávky nebo Výrobky. Shodou
okolností tvoří dvojice (ČísloObjednávky, ČísloVýrobku) zároveň klíč tabulky Rozpis objednávek 9.
2.4 Struktura tabulek v databázi Northwind
Dále si prohlédněte jednotlivé tabulky 10. (V programu MS Access se oknu, v němž si prohlížíte
tabulku v řádkách a sloupcích, říká „datový list“.) Při prohlížení se dočkáte překvapení – pole
tabulek, jež obsahují cizí klíč jiné tabulky (viz předchozí sekci), nezobrazují skutečné klíče-kódy,
ale srozumitelná jména odpovídajících věcí či lidí. Podobně v poli „Nadřízený“ v tabulce
Zaměstnanci. Navíc v hlavičce datového listu často není jméno pole (např. KódZákazníka v tabulce
Objednávky), ale jiný titulek („Zákazník“).
Toto a další důležité věci lze pochopit z návrhu tabulek 11: každé pole má datový typ a někdy popis
viditelné v seznamu v horní části okna návrhu tabulky. Další vlastnosti polí lze nalézt na kartách
Obecné a Vyhledávání v dolní části okna, k tomu je vždy potřeba v seznamu nahoře vybrat to pole,
jehož vlastnosti chceme dole prohlížet. Zejména si všimněte vlastností Titulek, Velikost pole
(nabízené v závislosti na datovém typu pole). U výše zmíněných cizích klíčů je na kartě
Vyhledávání zakódováno, co se má místo cizího klíče-kódu zobrazovat. Např. u pole
ČísloZaměstnace v tabulce Objednávky a u pole Nadřízený v tabulce Zaměstnanci je zakódováno,
že se má zobrazit celé jméno příslušného zaměstnance. Tyto vlastnosti se použijí, kdykoli se má
pole zobrazit, tedy v datovém listu, v dotazech, sestavách a formulářích. (Pokud ovšem explicitně
nezvolíme pro daný případ vlastnosti jiné.)
V zobrazení datového listu tabulky Kategorie vidíme v poli Obrázek pouze text „Rastrový
obrázek“. Samotný obrázek zobrazíte poklepáním na „Rastrový obrázek“. 12
9
Tomu je tak, protože tabulka Rozpis objednávek zaznamenává vztah „eventuelně více – eventuelně více“ mezi
objednávkami a druhy výrobků. V takovýchto případech je situace vždy stejná jako zde.
10
Vyberte tabulku v seznamu, pak
vyvolané pravým tlačítkem myši…
nebo klávesa Enter či poklepání na jménu tabulky, či lokální menu
11
Tlačítko
dosažitelné buď z okna „Databáze“, nebo z lokálního menu na tabulce či na titulkovém pásu datového
listu, či jako samostatná volba „Zobrazit“ v panelu nástrojů zcela vlevo.
12
Vzorové databáze Northwind se drobně odlišují ve verzi 2000 a 2002. Pole Foto tabulky Zaměstnanci v jednom
případě obsahuje „Rastrový obrázek“, v druhém případě je v něm jméno souboru obsahujícího obrázek. „Rastrový
obrázek“ je zaznamenán v databázi, je její součástí, kdežto soubor s obrázkem je mimo databázi.
10
2.4.1 Vysvětlení k některým polím v databázi Northwind
Některá pole některých tabulek v databázi Northwind stojí za zvláštní zmínku.
Pole Telefon a Fax jsou typu text, a ne nějakého číselného typu. To je proto, že ve skutečnosti nejde
o čísla, s nimiž lze dělat výpočty, ale o číselné kódy. Navíc se často používají různé oddělovací
znaky na členění telefonních čísel – podívejte se do příslušných datových listů.
Pole Kontaktní osoba u Zákazníků a Dodavatelů obsahuje jméno i příjmení, někdy i více částí. To
lze spíše považovat za nevhodné. Lépe je tomu v tabulce Zaměstnanci, kde jsou zvlášť pole Jméno
a Příjmení.
Pole Poznámky v tabulce Zaměstnanci a pole Popis v tabulce kategorie jsou typu „memo“, což je
datový typ pro text předem neurčené délky, tzv. „volný text“.
Pole Dopravné v tabulce Objednávky a obě pole JednotkováCena v tabulkách Rozpis objednávek i
Výrobky jsou typu „měna“. To je speciální číselný typ, určený k ukládání peněžních údajů. Je to
přesný číselný typ (tedy se nezaokrouhluje), a v programu MS Access je zobrazován se znaky
národní měny. Je třeba mít na paměti, že znaky „Kč“ jsou pouze zobrazovány, nikoli uloženy
v datech v tabulkách, jde tedy pouze o formát.
Pole Sleva v tabulce Rozpis objednávek je typu „číslo jednoduché přesnosti“. To je datový typ, se
kterým se počítá jako se zaokrouhleným reálným číslem, tedy „nepřesný číselný typ“ 13. Navíc má
formát „procenta“, tedy například pokud je v tabulce uložena hodnota 0,2 pak je zobrazováno 20%.
Pole Obrázek v tabulce Kategorie je typu „objekt OLE“ (obsahuje celé obrázky), kdežto pole Foto
v tabulce Zaměstnanci je typu „text“ (osahuje pouze jméno souboru s obrázkem).
2.5 Formuláře
Pro názornost a pochopení si můžete prohlédnout vzorové formuláře v databázi Northwind,
formuláře najdete přepnutím na
v okně Databáze. Jsou zde formuláře
pojmenované stejně jako jména tabulek, ty doporučuji vyzkoušet.
Formuláře obecně slouží k pohodlnému prohlížení dat či ke vkládání nových dat.
2.6 Pochopení dat
Prohlížejte si tabulky, jejich strukturu, a hlavně schéma databáze tak dlouho, až pochopíte význam
dat v databázi. Pokud někdy později budete mít pocit, že datům nějak nerozumíte, vždy se vraťte
k těmto nástrojům: relace, návrhy tabulek, event. datové listy.
13
Reálné číslo s plovoucí desetinnou čárkou.
11
3 Příprava nástroje k procvičování úloh
Vzorová databáze Northwind obsahuje množství vzorových dat i vzorové aplikační objekty ke
zpracování dat. Jsou zde i takové objekty, jejichž výklad či vysvětlení přesahuje rámec záměru
těchto skript, neboť databáze Northwind je ukázkou řešení i pro tvůrce aplikací – programátory.
Abyste tuto vzorovou databázi při svých pokusech neporušili (na učebnách a studovnách VŠE je
dokonce přístupná pouze pro čtení), vytvoříte si vlastní nástroj pro pokusy a práci:
Spusťte program MS Access a v úvodním dialogu vyberte „Vytvořit novou prázdnou databázi“.
V následujícím dialogu uložte nový databázový soubor do nějaké vaší vlastní složky, nějak vhodně
si ho pojmenujte. Objeví se standardní interface programu MS Access, s otevřenou vaší novou
databází.
Protože při práci s vaší databází budete chtít nahlížet také do databáze Řešení či do vzorové
databáze Northwind, mohla by se vám okna plést. Proto je dobré zařídit, aby tlačítka na hlavním
panelu Windows představující jednotlivé otevřené databáze MS Access byla od sebe odlišitelná.
Databáze Řešení má název „řešení“ na odpovídajícím tlačítku, ve vaší databázi totéž zařídíte
následujícím postupem: V menu Nástroje vyberte Po spuštění… a dialogu „Po spuštění“ zadejte do
pole Název aplikace nějaké vaše zvolené jméno:
To jméno se pak objeví na hlavním panelu Windows, i v titulku okna MS Access s vaší databází.
Další krok se týká úspory místa, které vaše databáze bude zabírat: v menu Nástroje vyberte
Možnosti…, a na kartě Obecné zaškrtněte vlevo dole „Komprimovat při zavření“ 14:
Nyní do vaší databáze připojíte data ze vzorové databáze Northwind. Z menu Soubor vyberte Načíst
externí data,
. V následujícím dialogu „Propojit“ najděte vzorovou databázi
Northwind. V dalším dialogu „Propojit tabulky“ použijte tlačítko
a stiskněte OK. Nyní
je vaše databáze připojená k datům vzorové databáze Northwind, aniž byste vytvářeli zbytečnou
kopii těchto dat. Takto vypadají nyní objekty Tabulky ve vaší databázi:
14
Toto způsobí opravdu významnou úsporu místa, ale je to možno použít pouze u nesdílených souborů MS Access.
Sdílené databáze je třeba komprimovat (například správcem databáze) explicitně v době, kdy s databází nikdo jiný
nepracuje – volbou v menu Nástroje-Správa databáze-Zkomprimovat a opravit databázi.
12
Poznámka: Analogicky si lze připravit uživatelský nástroj připojující vás k jiné databázi. Podmínkou je dosažitelnost
databáze, k níž se chcete připojit (tj. existence a znalost přístupových cest) a schopnost programu MS Access číst data
eventuelně cizího formátu. Některé použitelné formáty můžete vidět v dialogu „Propojit“ jako nabízené typy souborů,
jiné mohou být dosažitelné prostřednictvím ovladače ODBC (konzultujte případně svého správce systému).
Dále z databáze Northwind zkopírujeme dva dotazy: v menu Soubor vybereme opět Načíst externí
data, ale tentokrát zvolíme
, a opět nalezneme vzorovou databázi Northwind.
Následující dialog „Import objektů“ má více karet, vybereme kartu Dotazy a na ní dotazy
„Mezisoučty objednávek“ a „Rozšířené podrobnosti objednávek“. Tyto dva dotazy jsou užitečné
pro realizaci mnoha úloh (viz konec této kapitoly). Takto vypadají nyní objekty Dotazy ve vaší
databázi:
Ještě si ve svém projektu upravte relace. V panelu nástrojů stiskněte tlačítko Relace
, otevře se
okno „Relace“. V něm jsou nějaké objekty propojené čarami, to vše se sem dostalo při propojování
dat z databáze Northwind, protože jste zvolili „Vybrat vše“. Přidáte oba zkopírované dotazy:
Zobrazit tabulku, v následujícím dialogu „Zobrazit tabulku“ na kartě
v menu Relace vyberte
Dotazy vyberte oba dotazy „Mezisoučty objednávek“ i „Rozšířené podrobnosti objednávek“.
Přesouváním a zvětšováním obdélníčků upravte vzhled v okně „Relace“ do podoby podle obrázku
na následující straně dole.
Dále vytvořte propojení mezi „Rozšířené podrobnosti objednávek“ a „Výrobky“: v menu Relace
vyberte Upravit relaci…, v následujícím dialogu zmáčkněte tlačítko
„Vytvořit novou“ nastavte
potvrďte, a v dialogu „Upravit relace“ zmáčkněte
propojení:
13
a v dialogu
. Podobně vytvořte dvě další
Vaše relace nyní mají vypadat takto:
(Vzory relací si můžete prohlédnout i v databázi Řešení.)
Kontrolu správnosti či opravy chyb v okně Relace můžete udělat takto: v menu Relace
vyberte Zobrazit všechny relace. Pokud se objevilo něco navíc oproti vaší představě
(oproti tomu, jak je to na vzoru zde nahoře), pak odstraňte nejprve přebytečné čáry
neboli relace tím, že na ně klepnete myší (je třeba se trefit) a stisknete klávesu Delete,
následně potvrďte. Pak teprve odstraňujte eventuelní přebývající objekty obdélníčků (tj.
přebytečné tabulky nebo dotazy).
3.1 K čemu slouží relace ve vašem projektu?
Okno zobrazující relace vám může sloužit jako zobrazení schématu databáze, při němž si můžete
rozmýšlet strategii vašich dotazů. (Tlačítko
aktivní okno „Databáze“.)
pro otevření okna „Relace“ je dostupné, když je
Relace definované v databázi MS Access jsou cenným pomocníkem při tvorbě dotazů, sestav,
formulářů.
Poznámka: Pokud jste si připravili databázi MS Access připojující vás k cizímu zdroji podle dřívější poznámky, je
vhodné upravit si také relace. Jaké by měly být, to vám může poradit vlastník či správce zdroje dat.
3.2 Dotazy Rozšířené podrobnosti objednávek a Mezisoučty objednávek
Poklepáním na ikony „Rozšířené podrobnosti objednávek“ a „Mezisoučty objednávek“ si
prohlédněte datové listy těchto dotazů. Prohlížení ukončete zavřením oken s těmito dotazy.
14
Oba dotazy ze vzorové databáze Northwind slouží jako pomocné dotazy pro mnoho úloh. První
z nich, „Rozšířené podrobnosti objednávek“, dopočítává celkovou částku účtovanou za jeden druh
výrobku v jedné objednávce. Zhruba řečeno, dopočítává
JednotkováCena*Množství*(1-Sleva)
k Rozpisu objednávek. (Tento výpočet je ještě upraven kvůli zaokrouhlovacím chybám.) Dotaz
„Mezisoučty objednávek“ pak dopočítává pro každou objednávku
∑výrobky v objednávce JednotkováCena*Množství*(1-Sleva)
V běžných obchodních databázích bývají tyto vypočtené hodnoty ukládány přímo v databázi, tj.
v tabulce podobné Rozpisu objednávek bývá ještě sloupec analogický poli VýslednáCena z dotazu
„Rozšířené podrobnosti objednávek“, a v tabulce podobné Objednávkám bývá ještě sloupec
analogický poli Mezisoučet z dotazu „Mezisoučty objednávek“.
3.2.1 Úprava dotazu Rozšířené podrobnosti objednávek
Dotaz Rozšířené podrobnosti objednávek je poněkud nevhodně navržen pro naše účely. Upravíme
ho:
Otevřeme návrh tohoto dotazu tlačítkem
, klepneme na seznam „Výrobky“ a klávesou Delete ho
z dotazu odstraníme. Tím je úprava skončena, uložíme z menu Soubor-Uložit či tlačítkem Uložit
v panelu nástrojů. Návrh nyní vypadá takto:
3.3 Kopie vzorových řešení
Z databáze Řešení si kdykoli můžete do svého projektu importovat některé objekty, pokud pocítíte
takovou potřebu. Postup je následující: v menu Soubor vyberte Načíst externí data, zvolte
, a nalezněte databázi Řešení. Následující dialog „Import objektů“ má více karet,
vyberte kartu s příslušným typem objektů a nalezněte žádaný objekt. Pokud chcete importovat
sestavu, musíte si k ní přiimportovat i příslušný její datový zdroj – jak zjistit, který to je, popisuje
kapitola Sestavy.
Pro začátek si importujte dotaz „Smluvní partneři“. Tento dotaz poskytuje ucelený pohled na
smluvní partnery, ať zákazníky nebo dodavatele. Propojovat ho v relacích nebudeme, neboť se
použije jen zřídka. (Příkladem jeho použití jsou dotazy „Tři části jména“ a „Zákazníci a dodavatelé
výrobků podle měst“.)
Dále se vám může často hodit dotaz „Jména zaměstnanců“ 15, importujte si ho též.
V dalším textu se občas setkáte s výzvou, abyste si pořídili kopii nějakých dalších objektů.
15
Pro sloupce křížových dotazů či do kontingenčních tabulek nebo grafů.
15
4 Jednoduché dotazy
Dotazy jsou hlavní nástroj pro získávání informací z databáze. Nejčastěji poslouží tzv. jednoduché
dotazy.
Jednoduché dotazy lze většinou vytvořit pomocí průvodce. Použijeme tohoto průvodce k tomu,
abychom vytvořili první dotaz jako příklad, a na něm si vysvětlíme, co dotazy vlastně jsou.
4.1 První jednoduchý dotaz
Přepněte okno Databáze na Dotazy:
Zde je ikona „Vytvořit dotaz pomocí průvodce“. Spusťte ji 16. Spustí se průvodce, první krok.
V tomto kroku vybíráte některá pole z některých tabulek: nejprve v seznamu „Tabulky či dotazy“
vyberete příslušnou tabulku, čímž se v seznamu „Dostupná pole“ vlevo dole objeví všechna pole
vybrané tabulky. Z tohoto seznamu vybíráte 17 některá pole do seznamu „Vybraná pole“ vpravo
dole. Můžete pokračovat zvolením další tabulky.
Vyberte takto z tabulky Zákazníci pole Firma, z tabulky Kategorie pole
NázevKategorie a z tabulky Výrobky pole NázevVýrobku, stiskněte tlačítko
„Další“. Následující krok průvodce zatím zcela přeskočíme, tedy ještě
jednou „Další“. V následujícím kroku pojmenujte tento první dotaz, a
dokončete průvodce tlačítkem „Dokončit“.
Otevřel se datový list s odpovědí na dotaz. Odpověď na dotaz je tabulka, sestavená podle nějakého
návodu. Tímto návodem je formulace dotazu. Tuto si lze prohlédnout, když přepneme na zobrazení
„Návrhové“ 18.
Formulace dotazu říká, z jakých tabulek má být odpověď vytvářena, jak mají být tyto tabulky
navzájem spojeny, a jaká pole mají být ve výsledku vybrána. Složitější dotazy mohou mít další
specifikace.
16
nebo klávesa Enter či poklepání na ikonu, či lokální menu vyvolané pravým tlačítkem myši…
17
Poklepání nebo klávesa Enter nebo pomocí tlačítek se šipkami mezi oběma seznamy v dialogu průvodce.
18
Z menu Zobrazit, či přepínačem
v panelu nástrojů.
16
V našem případě byly průvodcem vybrány tabulky Zákazníci, Objednávky, Rozpis objednávek,
Výrobky a Kategorie, spojeny byly tak jak to naznačují čáry mezi nimi v horní části okna návrhu
dotazu. Vybrána byla pole, která jsme vybrali v průvodci – ta jsou v dolní části návrhu dotazu,
v tzv. návrhové mřížce dotazu.
Co to průvodce udělal a proč? Pomůže nám pohled na schéma databáze. Označme si pole, která
jsme v průvodci vybrali:
DODAVATELÉ
ČísloDodavatele
Firma
KontaktníOsoba
Funkce
Adresa
Město
Region
PSČ
Země
Telefon
Fax
DomovskáStránka
KATEGORIE
ČísloKategorie
NázevKategorie
Popis
Obrázek
1
1
ROZPIS_OBJEDNÁVEK
∞
ČísloObjednávky
∞ ČísloVýrobku
JedotkováCena
Množství
Sleva
VÝROBKY
ČísloVýrobku
NázevVýrobku
∞ ČísloDodavatele
∞
ČísloKategorie
MnožstvíVJednotce
JedotkováCena
JednotkyNaSkladě
ObjednánoJednotek
MinimálníÚroveň
NákupUkončen
1
ZAMĚSTNANCI
ČísloZaměstnance
Příjmení
Jméno
Funkce
FormálníOslovení
DatumNarození
ZaměstnánOd
Adresa
Město
Region
PSČ
Země
TelefonDomů
Linka
Foto
Poznámky
Nadřízený
ZÁKAZNÍCI
1 KódZákazníka
Firma
KontaktníOsoba
Funkce
Adresa
Město
Region
OBJEDNÁVKY
1 ČísloObjednávky
PSČ
∞ Země
KódZákazníka
∞
Telefon
ČísloZaměstnance
Fax
DatumObjednávky
1 DodatDne
DatumOdeslání
∞
Přeprava
Dopravné
JménoPříjemce
AdresaPříjemce
MěstoPříjemce
RegionPříjemce
1 PŘEPRAVCI
ČísloPřepravce
PSČPříjemce
Firma
ZeměPříjemce
Telefon
Tato vybraná pole jsou z různých tabulek, bez uvažování souvislostí mezi tabulkami databáze by
nebylo jasné, jak hodnoty Firma, NázevKategorie a NázevVýrobku vzájemně kombinovat. Vhodné
kombinace jsme již dříve určili relacemi mezi tabulkami, v okně „Relace“. Tam jsou zadány
souvislosti mezi některými tabulkami. Souvislosti mezi ostatními tabulkami mohou být odvozeny
jako „cesty propojení z relací“. Takže například souvislost mezi Výrobky a Zákazníci může být
odvozena ze souvislostí mezi Výrobky a Rozpis objednávek, dále mezi Rozpis objednávek a
Objednávky a nakonec mezi Objednávky a Zákazníci. Průvodce vlastně hledal cestu mezi
tabulkami Výrobky a Zákazníci tvořenou relacemi, jež jsou v databázi zvoleny.
Tento postup, tedy hledání cesty spojující pole, jež pro své účely potřebujeme, můžeme dělat i sami,
prohlížejíce si schéma databáze.
V našem případě bude uděláno toto: Pro danou zákaznickou firmu budou nalezeny všechny
objednávky, jež tento zákazník podal, a to podle relace dané kódem zákazníka. Dále každé
objednávce podané tímto zákazníkem budou nalezeny všechny řádky z tabulky Rozpis objednávek
podle relace dané číslem objednávky. Ke každému z těchto řádků bude nalezen výrobek z tabulky
Výrobky podle relace dané číslem výrobku. U tohoto výrobku bude přečten název výrobku –
výsledkem je dvojice Firma, NázevVýrobku. Význam této kombinace je, že tato zákaznická firma
někdy objednala výrobek tohoto názvu, existuje taková objednávka. Pokud zákaznická firma takové
objednání udělala vícekrát, bude kombinace těchto dvou hodnot, Firma a NázevVýrobku, ve
výsledku vícekrát – tolikrát, kolik bylo řádků v Rozpisu objednávek s daným číslem výrobku a
číslem nějaké objednávky, kterou podal tento zákazník.
17
Pohleďte znovu na odpověď na dotaz tím, že přepnete na zobrazení datového listu 19. Přesvědčte se,
že trojice „Save-a-lot Markets, Nápoje, Chang“ je na řádcích 46, 49, 58, 59, 76. To znamená, že
zákazník Save-a-lot Markets objednával výrobek Chang celkem 5krát (v 5ti objednávkách).
4.1.1 Řazení v návrhu dotazu
V odpovědi se nám špatně vyhledává, je nepřehledná. To napravíme požadavkem na řazení
v návrhu dotazu. Upravte mřížku dotazu:
,
a podívejte se na odpověď v datovém listu. Řádky jsou řazeny podle zákazníků (abecedně podle
firem). Ještě je vhodné upravit pořadí výsledků u jednotlivých zákazníků:
Nyní je prvním klíčem uspořádání odpovědi jméno firmy zákazníka, druhým klíčem je název
kategorie, a třetím název výrobku.
Do našeho dotazu můžeme přidat požadavek na zobrazení datumu objednávky. Asi by v tuto chvíli
bylo hloupé začínat celý dotaz znovu od začátku. Místo toho si zde další pole přidáme:
Horní část návrhového zobrazení dotazu, ve které jsou tabulky, může sloužit i
jako nabídka polí, jež chceme přidat do mřížky dotazu. V okénku zobrazujícím
seznam polí tabulky Objednávky vyberte pole DatumObjednávky 20.
(Také bylo možno zvolit toto pole přímo ve volném sloupci v mřížce dotazu.) Pak požádejte o
zobrazení datového listu odpovědi na dotaz.
Je přidána informace o datu objednávek. Nyní nás nemusí uspokojovat řazení, které jme předtím
zadali, a budeme chtít u jednotlivých zákazníků řadit chronologicky. V návrhu dotazu změníme
řazení (zrušíme řazení u NázevKategorie a NázevVýrobku):
Pohled na odpověď je nyní vzhledem k požadavku na chronologické řazení lepší, ale možná by bylo
lépe, kdyby se DatumObjednávky přesunulo doleva hned za Firma. V návrhovém zobrazení
vybereme celý sloupec v mřížce tak, že klepneme nad sloupec a tažením myší za horní lištu sloupce
ho přesuneme.
Opět si prohlédněte odpověď.
19
Z menu Zobrazit, či přepínačem
20
Poklepání nebo Enter.
v panelu nástrojů.
18
4.1.2 Co je dotaz
Uložte svůj dotaz 21. Co se vlastně uložilo? Uložil se návrh dotazu, nikoli odpověď. Jestliže příště
otevřete svoji databázi MS Access, naleznete v ní svůj dotaz, a spustíte ho, tj. požádáte o zobrazení
datového listu odpovědi, může být odpověď jiná, pokud se data ve zdrojové databázi mezitím
změnila.
Podstatnou částí návrhu dotazu je SQL-kód dotazu. Tento kód můžete vidět po otevření dotazu
přepnutím na Zobrazení SQL. SQL-kód je to, co MS Access pošle databázovému serveru, pokud
máte data propojená z nějakého databázového serveru a dotaz převedete na „předávací“. 22
Databázový server pošle programu MS Access tabulku odpovědi.
Další částí uloženého návrhu dotazu mohou být formátové požadavky na zobrazení datového listu
v MS Access. O tom je následující sekce.
4.1.3 Úpravy v datovém listu odpovědi
Máte-li zobrazen datový list odpovědi, můžete použít menu Formát pro úpravy vzhledu datového
listu. Lze též seřadit datový list odpovědi pomocí tlačítek
v panelu nástrojů, nebo hledat
pomocí tlačítka (totéž jako menu Úpravy-Najít). V tom případě se řadí podle vyznačených
sloupců nebo hledá ve vyznačených sloupcích.
Zrušení řazení v datovém listu uděláte z menu Záznamy-Zrušit filtr či řazení dat.
Dále můžete v datovém listu použít filtr. Tento filtr pracuje nad hotovou odpovědí, neposílá se tedy
databázovému serveru. Důvodem k jeho použití může být to, že nechcete znovu a znovu posílat dotazy na
databázový server, což může být nákladné, ale chcete různě prozkoumávat odpověď, kterou jste již dostali.
V takovém případě by byl postup tento: v menu Záznamy vyberete Rozšířený filtr, a dále postupujete jako při
kritériích v návrhu dotazu – tato budou vyložena v následující sekci. Pokud chcete vytvořený filtr použít,
zmáčknete tlačítko . Tento filtr lze pak vypínat a zapínat tímto tlačítkem, či změnit na jiný filtr pomocí
opětného vyvolání Záznamy-Rozšířený filtr.
Pohodlnější cestou v takovém případě ale bude zkopírovat si celý datový list (menu Úpravy-Vybrat všechny
záznamy, pak kopie) a vložit ho do programu MS Excel, kde jsou lepší možnosti práce.
Jinou možností je uložit tabulku odpovědi do databáze (projektu) MS Access tím, že při návrhovém zobrazení
dotazu změníte v menu Dotaz volbu na Vytvářecí dotaz, a novou tabulku pojmenujete, následně dotaz spustíte,
čímž se nová tabulka vytvoří. Při práci s touto tabulkou je pak třeba pamatovat na to, že se jedná o kopii
zdrojových dat, která již nemusí být aktuální.
4.1.4 Kritéria v návrhu dotazu
Dotaz může požadovat, aby do odpovědi byly vybrány pouze některé řádky. Tento výběr určíme
zadáním kritérií. Můžeme například požadovat výběr pouze těch řádků, kdy datum objednávky bylo
z roku 1997.
V řádku Kritéria ve sloupci DatumObjednávky v mřížce návrhu dotazu napíšeme
, znaky # nemusíte na klávesnici hledat, program MS Access je za vás
doplní – je tedy možno napsat pouze Between 1.1.1997 and 31.12.1997.
Můžeme přidat další kritérium: chceme pouze objednávky firmy Bon app’ v roce 1997
21
Z menu Soubor-Uložit nebo tlačítkem
v panelu nástrojů.
22
Databázový server může podporovat jinou verzi SQL a může mít svůj dialekt. V takovém případě je vždy nutné se
seznámit s dotazovacím jazykem, jejž server používá. Kód vygenerovaný z návrhového zobrazení dotazu v MS Access
je třeba upravit do podoby vhodné k předání databázovému serveru.
Pokud máte propojená data z nějaké klientské databáze, provádí příkaz SQL nad cizími daty MS Access sám.
19
uvozovky obalující text Bon app’ opět nemusíte psát, MS Access je za vás doplní.
Další příklady je možno nalézt v databázi Řešení, ve skupině Jednoduché. Následující sekce podává
systematický výklad možností kritérií v dotazech.
4.2 Kritéria v dotazu
Datový
typ pole
Možnosti kritérií
Poznámka
text ,
memo
"konkrétní text"
V textu nesmí být znak ",
lze alternativně použít jednoduché uvozovky: 'text'
Like "text se zástupnými
symboly"
Zástupné symboly jsou 23:
* … jakýkoli úsek textu
? … jeden znak
>, >=, <, <= "konkrétní text"
číslo
Between "konkrétní text" and
"konkrétní text"
Řadí se podle abecedy. Nemá přílišný praktický význam.
číslo
má spíše význam
pouze u diskrétní
škály možných čísel
>, >=, <, <= číslo
čísla píšeme s národním
oddělovačem desetinných míst 24,
bez dalších formátových znaků
Between číslo1 and číslo2
datum
datum
>, >=, <, <= #datum#
používáme formát datumů národní lokalizace 25
Between #datum1# and
#datum2#
logická
hodnota
ano, ne 26
všechny
typy
In (hodnota1;hodnota2;…)
Hodnoty musí být zapsány ve formátu odpovídajícího
datového typu.
Poznámky pod čarou týkající se SQL databází budou přicházet v úvahu, pokud budete pomocí MS Access
připojeni k nějaké SQL databázi jiné než MS SQL Server.
Kritéria lze kombinovat. Je-li více kritérií v jednom řádku, mají být splněna všechna najednou.
Máme-li na mysli alternativní kritéria, musíme použít více řádků: každý řádek je jedna alternativa –
jako příklad viz dotaz „Snadno dostupné výrobky“ ve skupině Jednoduché.
23
Ve standardu SQL jsou to znaky % a _ .
24
V SQL-databázích to bývá desetinná tečka.
25
V SQL-databázích bývá obvyklý formát rok/měsíc/den .
26
V SQL-databázích to může být y,n nebo 0,1 nebo f, t (jako false, true).
20
V kritériích lze též vzájemně porovnávat různá pole ze stejné databáze, příklady viz dotazy
„Dopravné víc než 5% mezisoučtu“ a „Výrobky k doobjednání“ ve skupině Jednoduché, v nichž se
zároveň používají i výrazy.
Složitějším příkladem porovnání dvou polí vzájemně je dotaz „Zlevnění výrobku“, to je poměrně velmi náročný
dotaz.
4.3 Jedinečné hodnoty
Pokud chceme zamezit opakování řádků v odpovědi, jako tomu bylo v našem prvním dotaze, než
jsme do něj přidali pole DatumObjednávky, lze to udělat v návrhovém zobrazení dotazu v dialogu
Vlastnosti dotazu. Tento dialog zavoláme stištěním tlačítka -Vlastnosti a následným klepnutím
myší mimo návrhovou mřížku i mimo seznamy polí tabulek v horní části. V dialogu „Vlastnosti
dotazu“ v řádku Jedinečné hodnoty zvolíme Ano 27:
Příklady viz ve skupině Jednoduché, jež mají poznámku „jedinečné hodnoty!“.
4.4 Výrazy v dotazu
V dotazech lze použít i výrazy, buď jako nové pole v mřížce návrhu dotazu, nebo v kritériích.
Příklady viz dotazy „Den v týdnu objednávky 10305“, „Hodnota skladu“, „Lhůty dodání“, „Jména
zaměstnanců“ ve skupině Jednoduché.
Nové („vypočítané“) pole v návrhu dotazu má datový typ a formát, implicitně určený programem
MS Access. Můžeme chtít formát, eventuelně datový typ, změnit. Jako příklad viz v dotazu
„Dopravné víc než 5% mezisoučtu“ pole „Dopravné/Mezisoučet“. To má formát Procenta.
Datový typ lze změnit použitím některé z funkcí konverze datových typů. Jako příklad viz dotaz „Rozšířené
podrobnosti objednávek“, výraz pro pole „VýslednáCena“. Zde je použita funkce Ccur, konverze na typ měna.
Důvodem k tomuto jejímu použití v tomto dotazu je to, že pole „Sleva“ v tabulce „Rozpis objednávek“ je typu
„jednoduchá přesnost“, což je datový typ, jenž povoluje nepřesnosti při výpočtech. Pak celý výraz
[Rozpis objednávek].JednotkováCena*[Množství]*(1-[Sleva])
je typu „jednoduchá přesnost“, a výsledek je nepřesný. Ve výrazu pro „VýseldnáCena“ je dále ještě dělení 100 a
následné násobení 100 proto, že typ měna má v MS Access 4 desetinná místa za desetinnou tečkou, a tímto
získáme 2 desetinná místa.
Vzorová databáze Northwind se tím, že pole „VýslednáCena“ není přímo obsaženo v tabulce „Rozpis
objednávek“ (tedy při zaznamenávání objednávky není tato hodnota vypočítána a následně hned uložena), stává
uživatelsky nepříjemnou 28. Podobná poznámka platí i pro „Mezisoučet“, jenž by mohl být přímo součástí
záznamů tabulky „Objednávky“. V mnoha obchodních databázích jsou tyto vypočítané hodnoty ukládány ve
„vypočítaných polích“ tabulek.
27
Tím přidáme klíčové slovo DISTINCT za SELECT v SQL-kódu.
28
A provozně neefektivní, neboť příslušné výpočty musí být stále znovu prováděny.
21
4.4.1 Formát a zobrazení pole v dotazu
Pole v návrhu dotazu, jež je polem nějaké tabulky nebo jiného dotazu vstupujícího jako tabulka do
stávajícího dotazu, přebírá všechny vlastnosti, tedy i formát. Pokud něco z toho chceme změnit,
uděláme to v dialogu vlastností pole, jejž lze pro sloupec, ve kterém je kurzor, vyvolat kombinací
kláves Alt+Enter nebo stisknutím tlačítka -Vlastnosti v panelu nástrojů.
Pole může být i přejmenováno, a to vepsáním nového jména a dvojtečky dopředu v prvním řádku
v daném sloupci v mřížce návrhu dotazu. Příklady viz pole „ZeměPůvodu“ v dotazu „Snadno
dostupné výrobky“ nebo pole „HodnotaSkladu“ v dotazu „Hodnota skladu“, a jiné. V těchto
příkladech mají zmíněná pole ještě zvolený titulek.
Titulek pole můžeme zadat ve vlastnostech pole. Titulek polí může být, jako ostatní vlastnosti,
převzat z původní tabulky nebo dotazu vstupujícího jako tabulka do stávajícího dotazu. Toto lze ve
stávající dotazu změnit.
4.4.2 Tvůrce výrazů
Pro tvorbu výrazů lze použít tvůrce výrazů, jejž lze zavolat tlačítkem -Sestavit v panelu nástrojů
pro návrh dotazu 29. Okno Tvůrce výrazů má v horní části políčko pro sestavovaný výraz, a pod ním
je nabídka toho, co lze při sestavování použít.
toto je políčko pro
sestavovaný výraz
zde se
objevuje
seznam
daný
výběrem
vlevo
a zde
eventuelně
další,
podle
výběru
uprostřed
V levém seznamu dole je základní členění. Pokud například do výrazu potřebuji pole nějaké
tabulky, rozvinu nejprve nabídku tabulek pomocí před „Tabulky“, pak naleznu tuto tabulku a
vyberu ji v seznamu. V prostředním seznamu dole se objeví seznam polí této tabulky. Poklepáním
či vybráním a pak klávesou Enter umístíme vybrané pole na pozici kurzoru do sestavovaného
výrazu v políčku nahoře. S poli jiných dotazů je to analogické 30.
Dále si povšimněte nabídky Funkce – Vestavěné funkce, kde nalezneme tematicky rozdělené
funkce, jež lze ve výrazech MS Access použít.
Pokud bychom MS Access použili pro připojení k databázovému serveru a dotaz tomuto serveru předávali, pak
lze použít jen ty funkce, jež onen databázový server umí.
29
Tvůrce výrazů lze zavolat i v jiných situacích, nejenom při navrhování dotazu, například při tvorbě výrazu v tiskové
sestavě. Pak může být spouštěn jiným způsobem.
30
V jiných situacích nás mohou zajímat i pole jiných typů objektů.
22
Pokud potřebujeme nějakou funkci, nejlépe je do sestavovaného výrazu nejprve vybrat tuto funkci,
a pak v jejích argumentech nahrazovat to, co tam chceme dát.
Poslední v seznamu jsou Konstanty, Operátory, Běžné výrazy – prohlédněte. Nejběžnější značky
jsou na tlačítkách pod políčkem pro sestavovaný výraz.
Někdy se stane, že tvůrce výrazů do sestavovaného výrazu vloží text «Výraz», jež se nám nehodí.
Je třeba sledovat, co se v políčku pro sestavovaný výraz objevuje, a eventuelně nežádoucí části
smazat.
Užitečná je první volba v seznamu vlevo, jež nabízí pole dotazu 31, s nímž právě pracujete. Zde se
ovšem nabízejí pouze pole z již uložené verze dotazu. Pro pohodlnou práci je tedy možné nejprve
do návrhové mřížky dotazu vložit všechna pole, jež budou do výrazu potřeba, pak dotaz uložit, a
následně zavolaný tvůrce výrazů nám v první nabídce poskytne všechna pole potřebná k sestavení
výrazu.
Jen v případě shody jmen polí v různých tabulkách z dotazu je třeba specifikovat, které z nich
myslíme. Tehdy je třeba vybrat tabulku, a pak její pole. Do výrazu se pak dostane úplná specifikace
obsahující i jméno tabulky.
Pozor – do výrazů v dotazu nelze použít jména pojmenovaných nebo přejmenovaných polí tohoto
dotazu, to není legální a až na výjimky takový dotaz nefunguje. V takovém případě nezbývá než
namísto odpovídajícího jména jiného sloupce použít výraz, který ten jiný sloupec vytvořil. Pokud
bychom například v dotazu „Přehled objednávek“ ve skupině „Jednoduché“ chtěli přidat kritérium
porovnávající zemi zákazníka se zemí zaměstnance, pak bychom museli ve sloupci
Zákazníci_Země vytvořit kritérium
, a nikoli
– toto by bylo špatně.
4.4.3 Lupa
Výraz lze psát vždy také ručně, bez pomoci tvůrce. Pokud je náš výraz delší, a chceme ho psát,
nebo pokud si chceme delší výraz prohlédnout, vyvolejte lokální menu na tomto výrazu, a vyberte
„Lupa“.
4.5 Jak používat průvodce jednoduchým dotazem
V této kapitole jsme začali vytvořením prvního dotazu pomocí průvodce jednoduchým dotazem.
Nabízí se otázka, jaká pole v průvodci vybírat, když některá pole chceme mít zobrazována ve
výsledku, jiná slouží pouze k formulování kritérií, a podle některých chceme řadit. Navíc chceme
mít v dotazu nová pole vytvořená jako výrazy.
V prvním kroku průvodce vybereme pole:
•
jež chceme zobrazit do výsledku,
•
jež budeme potřebovat do výrazů (může následně nastat problém, když průvodce takové pole pojmenuje
nebo přejmenuje – pak je použití tvůrce výrazů pracnější),
•
podle kterých chceme řadit nebo pro ně zadat kritéria.
Někdy, když v databázi, se kterou pracujeme, je v relacích možno nalézt alternativní cesty propojení, by mohl
průvodce vybrat takové propojení, které nechceme. Potom v průvodci vyberme ještě nějaká pole (například
31
V jiném kontextu to jsou pole aktuálního objektu.
23
klíče) tabulek, přes které chceme vybrat cestu propojení. Například následující schéma umožňuje propojit název
žánru s příjmením a jménem umělce buď prostřednictvím relace Titul.režie=Umělec.ID , nebo s použitím
tabulky „Hraje“ prostřednictvím relací Titul.ID=Hraje.titul a Hraje.herec=Umělec.ID. Jde o to, zda nás umělec
zajímá v roli režiséra či herce. Pokud nás zajímá umělec v roli herce v nějakém titulu daného žánru, pak
v průvodci vybereme kromě polí Žánr.název, Umělec.Jméno, Umělec.příjmení ještě např. pole Hraje.titul (nebo
Hraje.herec, to vyjde nastejno).
Otázkou je, zda vůbec někdy budeme potřebovat sestavovat dotaz jinak, než pomocí průvodce.
4.6 Dotaz v návrhovém zobrazení
Ukažme si dotaz, pro který nemůžeme použít průvodce jednoduchým dotazem. Je to příklad „Města
se zaměstnanci i zákazníky“ ve skupině „Jiné propojení“. Jeho smyslem je nalézt případy, kdy
nějaká zákaznická firma má sídlo ve městě, ve kterém bydlí některý zaměstnanec.
Strategie dotazu je taková, že hledáme dvojice Zákazník, Zaměstnanec, kdy Zákazník.Město je
rovno Zaměstnanec.Město .
Nemůžeme použít průvodce a v něm vybrat Zákazník.Město a Zaměstnanec.Město , neboť
průvodce by do dotazu kromě tabulek Zaměstnanci a Zákazníci vybral i tabulku Objednávky a
vytvořil propojení podle relací, tj. ve výsledku bychom měli pouze ty dvojice zákazníků se
zaměstnanci, mezi nimiž proběhlo nějaké objednání. Porovnejte případný výsledek takovéhoto
pokusu s výsledkem dotazu „Města se zaměstnanci i zákazníky“.
V databázi řešení jsou dvě možnosti řešení této úlohy, jedna s kritériem (dotaz „Města se
zaměstnanci i zákazníky 2“), druhá s propojením tabulek Zákazníci a Zaměstnanci pomocí polí
Město (dotaz „Města se zaměstnanci i zákazníky“).
Vytvoříme dotaz stejný, jako je „Města se zaměstnanci i zákazníky“.
V okně Databáze, v Dotazy, zvolte „Vytvořit dotaz v návrhovém zobrazení“. Otevře se dialog
„Zobrazit tabulku“ → ,
v němž vybíráme tabulky, jež potřebujeme do
dotazu dát. V našem případě vybereme tabulky
Zákazníci a Zaměstnanci. Do návrhu dotazu se
tyto tabulky vloží nepropojené:
24
Propojení vytvoříme přetažením myší pole Město z tabulky Zákazníci na pole Město z tabulky
Zaměstnanci, vytvoří se čára podobná relacím:
tažení myši
Dokončíme náš příklad výběrem pole Město do návrhové mřížky. Zamezit opakování v odpovědi
lze nastavením jedinečných hodnot (viz str.21).
Jako procvičení zkuste v návrhovém zobrazení vytvořit náš první dotaz, který jsme původně dělali
pomocí průvodce. (Musíte vybrat tabulky Kategorie, Výrobky, Rozpis objednávek, Objednávky a
Zákazníci…)
4.7 Přidávání tabulek do návrhu dotazu
Často se setkáme se situací, že jsme například pomocí průvodce vytvořili dotaz, a posléze zjistíme,
že bychom do něj rádi přidali pole, jež v tabulkách v dotazu není. Pak musíme do dotazu takovou
tabulku přidat, a možná ještě předtím zvážit, zda budeme muset přidat ještě nějaké další tabulky
kvůli propojení (podle schématu databáze).
Přidání tabulky do dotazu děláme po stisknutí tlačítka -Přidat tabulku v dialogu „Zobrazit
tabulku“, vybereme tabulku či tabulky, které potřebujeme. Tento dialog nabízí na kartě „Dotazy“ i
možnost připojit do stávajícího dotazu nějaký dříve uložený dotaz (jako mezivýsledek).
Připojení tabulky či jiného dotazu do stávajícího dotazu automaticky způsobí i přidání
odpovídajících propojení ze schématu relací. – Pomocné dotazy „Rozšířené podrobnosti
objednávek“ a „Mezisoučty objednávek“ jsme v relacích propojili, protože jsou používány v mnoha
dotazech i jinde.
Pokud přidávaný dotaz či tabulka nejsou propojeny v relacích , pak budeme muset propojení udělat
ručně. – Příkladem může být dotaz „Tržby za výrobky porovnání 1997 a 1998 Q1“, který je ve
skupině „Seskupovací“. Tento dotaz využívá mezivýsledků „Tržby za výrobky 1998 Q1“ a „Tržby
za výrobky 1997“ (oba patří k seskupovacím dotazům, o nich následující kapitola). – Jiný příklad je
„Zákazníci nakupující 10 nejdražších výrobků-lépe“, jenž využívá dotaz „Deset nejdražších
výrobků“, což je dotaz importovaný ze vzorové databáze Northwind. (Vysvětlení k tomuto
poslednímu příkladu je podáno v kapitole 8 Mezivýsledky.)
25
4.8 Nejvyšší hodnoty
Pokud máme v návrhu dotazu zadáno nějaké řazení, a zajímá nás pouze několik prvních řádků
z odpovědi, lze pomocí tlačítka Nejvyšší hodnoty
v panelu nástrojů zvolit, kolik prvních
řádků chceme mít v odpovědi. Počet řádků lze zadat přímo číslem, či procentuelně vůči celkovému
počtu všech řádků. Stejné nastavení lze udělat i v dialogu Vlastnosti dotazu, v poli „Nejvyšší
hodnoty“.
Příkladem je dotaz „Největší nákup výrobku“, který vrací informace o nejvyšším nákupu zvoleného
výrobku, a dotaz „Zákazník odkdy“, který vrací nejstarší datum objednávky zvoleného zákazníka.
Pomocí seskupovacího dotazu lze tyto informace získat pro všechny zákazníky najednou, viz dotaz „Zákazníci
odkdy“ ze skupiny „Seskupovací“. Pro případ odpovídající volbě „Nejvyšší hodnoty = 1“ lze analogického
výsledku dosáhnout vždy, byť někdy obtížněji – viz příklad „Statistika počtu zákazníků pro výrobky“, výklad
najdete v kapitole 5 Seskupovací dotazy.
4.9 Dotazy s parametry
V dotazu mohou být hodnoty v kritériích či ve výrazech zadávány také jako parametry. Po spuštění
takového dotazu se pak zobrazí dialogové okno, jež se potupně zeptá na hodnoty všech parametrů
dotazu. Stejný dotaz tak dává různé odpovědi podle toho, jak zadáváme různé hodnoty pro
parametry.
Parametr do dotazu zapisujeme jako text výzvy uzavřený do hranatých závorek, například chceme-li
dotaz ze str. 19 modifikovat tak, aby zobrazoval objednávky zvoleného zákazníka, změníme ho:
Pokud chceme zadávat i rok objednávek jako parametr, upravíme ještě
Další příklady jsou v databázi Řešení, ve skupině „Jednoduché“, dotazy „Výrobky prodávané ve
zvolené zemi“, „Největší nákup výrobku“, „Zákazník odkdy“.
V některých případech (například když by hodnota měla být typu
Ano/Ne 32) je potřeba určit datové typy parametrů, pak to uděláme
v návrhovém zobrazení dotazu z menu Dotaz-Parametry. V našem druhém příkladu by to bylo jako
na obrázku zde (pořadí určuje pořadí, v jakém jsou hodnoty vyžadovány).
32
Nebo když je dotaz křížový nebo když je následně zpracováván křížovým dotazem, nebo je podkladem pro graf, nebo
když je dotazem do externí SQL databáze…
26
5 Seskupovací dotazy
5.1 Co jsou seskupovací dotazy?
V seskupovacích dotazech se většinou počítají souhrny. Například jednoduchý přehled objednávek
z období mezi 1.5.1998 a 7.5.1998 lze rozdělit do skupin podle jednotlivých zaměstnanců:
ČísloZam Zaměstnanec ČísloObj DatumObj Mezisoučet
1 Davolio, Nancy
11077 06.05.1998 31 393,02 Kč
1 Davolio, Nancy
11071 05.05.1998 12 112,50 Kč
1 Davolio, Nancy
11069 04.05.1998 9 000,00 Kč
1 Davolio, Nancy
11067 04.05.1998 2 171,25 Kč
1 Davolio, Nancy
11064 01.05.1998 108 260,00 Kč
2 Fuller, Andrew
11073 05.05.1998 7 500,00 Kč
2 Fuller, Andrew
11070 05.05.1998 40 749,37 Kč
4 Peacock, Margaret
11076 06.05.1998 19 818,75 Kč
4 Peacock, Margaret
11072 05.05.1998 130 450,00 Kč
7 King, Robert
11074 06.05.1998 5 802,12 Kč
7 King, Robert
11066 01.05.1998 23 218,75 Kč
8 Callahan, Laura
11075 06.05.1998 12 452,50 Kč
8 Callahan, Laura
11068 04.05.1998 50 677,00 Kč
8 Callahan, Laura
11065 01.05.1998 4 735,50 Kč
Davolio, Nancy
Fuller, Andrew
Peacock, Margaret
King, Robert
Callahan, Laura
V dotaze, který předchozí přehled „seskupí“ podle zaměstnanců, lze pro každého zaměstnance
zopakovat pole ČísloZam a Zaměstnanec, a spočítat součet hodnot pole Mezisoučet ze skupiny
tohoto zaměstnance:
ČísloZam Zaměstnanec SumOfMezisoučet
1 Davolio, Nancy
162 936,77 Kč
2 Fuller, Andrew
48 249,37 Kč
4 Peacock, Margaret
150 268,75 Kč
7 King, Robert
29 020,87 Kč
8 Callahan, Laura
67 865,00 Kč
Specifické detaily o jednotlivých objednávkách, jako jsou hodnoty v poli ČísloObjednávky a v poli
DatumObjednávky, ve výsledném souhrnu nemohou být. Můžeme ovšem spočítat nejnižší a
nejvyšší datum objednávky u každého zaměstnance:
ČísloZam Zaměstnanec SumOfMezisoučet MinOfDatumObj MaxOfDatumObj
1 Davolio, Nancy
162 936,77 Kč
1.5.1998
6.5.1998
2 Fuller, Andrew
48 249,37 Kč
5.5.1998
5.5.1998
4 Peacock, Margaret
150 268,75 Kč
5.5.1998
6.5.1998
7 King, Robert
29 020,87 Kč
1.5.1998
6.5.1998
8 Callahan, Laura
67 865,00 Kč
1.5.1998
6.5.1998
a třeba ještě počet objednávek:
ČísloZam Zaměstnanec SumOfMezisoučet MinOfDatumObj MaxOfDatumObj Count
1 Davolio, Nancy
162 936,77 Kč
1.5.1998
6.5.1998
5
2 Fuller, Andrew
48 249,37 Kč
5.5.1998
5.5.1998
2
4 Peacock, Margaret
150 268,75 Kč
5.5.1998
6.5.1998
2
7 King, Robert
29 020,87 Kč
1.5.1998
6.5.1998
2
8 Callahan, Laura
67 865,00 Kč
1.5.1998
6.5.1998
3
27
Původní přehled můžeme rozdělit do skupin také jiným způsobem, podle jednotlivých kalendářních
dní:
ČísloZam Zaměstnanec DatumObj Mezisoučet
7 King, Robert
01.05.1998 23 218,75 Kč
8 Callahan, Laura
01.05.1998 4 735,50 Kč
1 Davolio, Nancy
01.05.1998 108 260,00 Kč
1 Davolio, Nancy
04.05.1998 9 000,00 Kč
8 Callahan, Laura
04.05.1998 50 677,00 Kč
1 Davolio, Nancy
04.05.1998 2 171,25 Kč
2 Fuller, Andrew
05.05.1998 7 500,00 Kč
4 Peacock, Margaret 05.05.1998 130 450,00 Kč
1 Davolio, Nancy
05.05.1998 12 112,50 Kč
2 Fuller, Andrew
05.05.1998 40 749,37 Kč
1 Davolio, Nancy
06.05.1998 31 393,02 Kč
4 Peacock, Margaret 06.05.1998 19 818,75 Kč
8 Callahan, Laura
06.05.1998 12 452,50 Kč
7 King, Robert
06.05.1998 5 802,12 Kč
1.5.1998
4.5.1998
5.5.1998
6.5.1998
Pak lze seskupit a vypočítat souhrny například:
DatumObj SumOfMezisoučet Count
01.05.1998
136 214,25 Kč
3
04.05.1998
61 848,25 Kč
3
05.05.1998
190 811,87 Kč
4
06.05.1998
69 466,39 Kč
4
– tedy jsou tržby a počty objednávek za jednotlivé dny.
V databázi Řešení ve skupině „Seskupovací“ je dotaz „Tržby zaměstnanců“. Ten počítá souhrny ze
všech objednávek, bez omezení datumu (přehled jednotlivých objednávek by v tomto případě ve
skriptech zabral příliš mnoho místa) – v tomto dotaze jsou navíc zobrazeny pole FormálníOslovení
a Funkce, ty lze pro každého zaměstnance přečíst z tabulky Zaměstnanci, a k souhrnům je přidat
jako další informaci.
Jak se vytvářejí seskupovací dotazy? Ačkoli je lze sestavit pomocí průvodce, první seskupovací
dotaz vytvoříme tak, abychom pochopili jak seskupovací dotazy fungují.
5.2 První seskupovací dotaz
Vytvořte si jednoduchý dotaz, který bude základem pro následující počítání souhrnů. Tento
jednoduchý dotaz bude přehledem všech objednávek zobrazující pole DatumObjednávky, dále pole
Mezisoučet z pomocného dotazu Mezisoučty objednávek, a pole ČísloZaměstnance, Příjmení,
Jméno z tabulky Zaměstnanci.
28
V následujícím dále přeměníme tento jednoduchý dotaz na seskupovací dotaz, jenž bude pro
každého zaměstnance počítat jeho celkové tržby za 1. čtvrtletí roku 1998:
Do mřížky návrhu dotazu přidáme řádek „Souhrn:“ 33. V řádku „Souhrn:“ nastavíme
„Sum“ v poli Mezisoučet,
„Kde“ v poli DatumObjednávky, v tomto poli ještě napíšeme kritérium,
v ostatních polích v řádku „Souhrn:“ ponecháme volbu „Seskupit“:
(Všimněte si, že po vybrání „Kde“ se automaticky odstranilo zaškrtnutí „Zobrazit“ v tomto
sloupci.) 34
Výsledek je hotov, stačí jen pojmenovat pole s vypočtenou tržbou (o přejmenování pole viz str.22).
Číslo zaměstnance Příjmení Jméno
Tržba
1 Davolio
Nancy 1 102 257,90 Kč
2 Fuller
Andrew 1 035 407,50 Kč
3 Leverling Janet
1 590 134,32 Kč
4 Peacock Margaret 954 687,00 Kč
5 Buchanan Steven
490 547,37 Kč
6 Suyama Michael
222 430,12 Kč
7 King
Robert
474 337,06 Kč
8 Callahan Laura
802 446,06 Kč
9 Dodsworth Anne
790 041,45 Kč
Změnou kritéria v poli DatumObjednávky změníme období, za které se má souhrn počítat, zkuste a
porovnejte výsledky.
Pokud bychom chtěli pro každého zaměstnance vypočítat tržby za nějaká různá období najednou,
například za jednotlivé měsíce roku 1998, je potřeba nejprve vytvořit výraz pro tato období – pro
daný příklad vytvoříme do dotazu pole Month(DatumObjednávky), v něm bude „Seskupit“ v řádku
„Souhrny:“, a zadáme kritérium omezující dotaz na rok 1998, například takto 35:
Ve výsledku vidíme, že pro každého zaměstnance je vypočítáno více souhrnů – za každý měsíc
jeden souhrn (měsíce, ve kterých zaměstnanec neměl žádnou objednávku, ve výsledku nejsou).
Můžeme vypočítat tržby i za jednotlivé měsíce ostatních let: přidáme pole s výrazem
Year(DatumObjednávky), ponecháme v něm „Seskupit“, a odstraníme předchozí kritérium:
33
Tlačítko
v panelu nástrojů, nebo menu Zobrazit-Souhrny, nebo z lokálního menu nad mřížkou návrhu.
34
Volba „Kde“ v řádku „Souhrn:“ slouží k označení pole, které použijeme pro kritérium omezující výchozí jednoduchý
dotaz, přičemž jednotlivé detaily z tohoto pole nemohou být zobrazeny v souhrnném výsledku.
35
Jiná možnost byla vytvořit pole Year(DatumObjednávky) a zadat pro ně kritérium 1998.
29
Vidíme, že seskupování může proběhnout podle více hledisek, v našem případě podle
zaměstnanců 36, roků a měsíců.
5.3 Agregační funkce
V řádku „Souhrn:“ je nabídka různých agregací pro dané pole. Nejčastěji používané jsou součet
(Sum), nejnižší hodnota (Min), nejvyšší hodnota (Max), průměr (Avg). (V úvodní podkapitole této
kapitoly by se pro získání druhého z výsledků použily Min a Max v poli DatumObjednávky.)
Specifická je agregace Count. K jejímu pochopení vyzkoušíme nejprve průvodce pro souhrnný
dotaz.
5.4 Průvodce pro souhrnný dotaz
Náš první seskupovací dotaz můžeme sestavit i pomocí průvodce. Je to stejný průvodce, jako pro
jednoduché dotazy (v okně Databáze, objekty Dotazy, ikona Vytvořit dotaz pomocí průvodce).
V prvním kroku průvodce vyberme z tabulky Zaměstnanci pole ČísloZaměstnace, Příjmení, Jméno,
z tabulky Objednávky vybereme DatumObjednávky a z dotazu Mezisoučty objednávek vybereme
Mezisoučet. V dalším kroku průvodce přepneme na „Souhrnný“, čímž se zpřístupní tlačítko
„Možnosti souhrnu“. Toto tlačítko stiskneme. V následujícím dialogu „Možnosti souhrnu“ se
nabízejí pole, která lze agregovat, a výběr agregací pro ně. Zaškrtneme „Součet“ u pole Mezisoučet.
Dále si všimněme možnosti zaškrtnout políčko vpravo dole, u kterého je poněkud méně
srozumitelný popis. Toto políčko též zaškrtněme:
Potvrdíme a tím se vrátíme do průvodce, zde stiskneme „Další“. Následující krok se v průvodci
objevuje v závislosti na tom, zda jsme předtím vybrali nějaké pole typu datum. V našem případě
tomu tak bylo, bylo to pole DatumObjednávky. Proto nám nyní průvodce nabízí možnosti seskupení
podle nabízených časových intervalů – vyberme „Měsíc“. V posledním kroku již nový dotaz pouze
pojmenujte, dokončete průvodce.
Porovnejte výsledný dotaz s dotazem, který jsme vytvořili jako náš první seskupovací dotaz.
Zásadní rozdíl je v tom, jak je zařízeno seskupování podle kalendářních měsíců – zde to zajišťují 4.
a 7. pole v mřížce návrhu dotazu – průvodce zde vytvořil poměrně složité výrazy, jež slouží pro
určení kalendářního měsíce z datumu. 4.sloupec, jenž má být zároveň ve výsledku zobrazen, má
výhodu toho, že výsledky jsou česky, zato je pro uživatele poměrně složitý. 7. sloupec zde slouží
k chronologickému řazení, když u něj zvolíte Řadit: vzestupně (zkuste a podívejte se na výsledek).
V databázi Řešení ve skupině Seskupovací porovnáním dotazů Tržby zaměstnanců po čtvrtletích 1 a Tržby
zaměstnanců po čtvrtletích 2 zjistíte, jak ještě jinak lze vytvořit výraz pro kalendářní období. Tato druhá podoba
má tu výhodu, že chronologické řazení zde odpovídá vzestupnému řazení těchto výrazů. To lze například využít
pro křížové dotazy (o nich viz dále).
36
Seskupení podle Příjmení a Jméno ve skutečnosti neproběhne, neboť tyto jsou pro dané ČísloZaměstnance jedinečně
určeny. Toto MS Access „zná“ z návrhu tabulky Zaměstnanci, kde ČísloZaměstnance je klíčem.
30
Z hlediska efektivity provádění dotazu databázovým serverem však není ideální ani jedna z těchto dvou
možností. Nejlepší je použít SQL funkce (např. Year, Month) jako je to popsáno v podkapitole „První
seskupovací dotaz“. Pokud nutně potřebujeme jediné pole pro kalendářní období, můžeme z nich eventuelně
v následujícím dotazu vytvořit jediný výraz z polí předchozího mezivýsledku.
Dále si povšimněme pole „Count Of Mezisoučty objednávek“, jež se zde vytvořilo proto , že jsme
v průvodci zaškrtli
podkapitola.
. V tomto poli je výraz Count(*). O něm viz následující
5.5 Count v seskupovacím dotazu
Pokud použijeme průvodce pro souhrnný dotaz, pak v dialogu Možnosti souhrnu je vždy vpravo
dole možno zaškrtnout „Počet záznamů v …“ (text záleží na konkrétním dotazu). Vždy se vytvoří
výraz Count(*), průvodce ho nějak pojmenuje. Co tento výraz počítá?
Count(*) počítá počet řádků v každé skupině výchozího jednoduchého dotazu, jenž je základem pro
seskupení. Pro pochopení, co je tedy vlastně počítáno, je nutné vědět, co tvoří řádky jednoduchého
dotazu, na kterém je daný seskupovací dotaz založen.
V našem příkladu se můžete vrátit k našemu prvnímu seskupovacímu dotazu, odstranit v něm řádek
„Souhrn:“ (a tím z něj udělat opět pouze jednoduchý dotaz) a podívat se na výsledek. Pro lepší
názornost si můžete zobrazení datového listu uspořádat podle sloupce ČísloZaměstnance.
Uvědomte si, že jednotlivé řádky nyní odpovídají jednotlivým objednávkám. Takže počet řádků ve
skupině daného zaměstnance je počet jeho objednávek. Neukládejte v této podobě, zavřete.
Nyní můžete do návrhu našeho prvního seskupovacího dotazu přidat pole
početObjednávek: Count(*) , a v řádku „Souhrn:“ vybrat „Výraz“ 37:
Tento výraz dává stejný výsledek, jako volba funkce Count v řádku „Souhrn:“ v poli, jež je vždy zaručeně
neprázdné. Takové pole může být ČísloObjednávky, ale třeba i ČísloZaměstnace. Záleží pouze na vašem vkusu,
co je pro vás příhodnější.
V řádku „Souhrn:“ je však možno volit také agregační funkci „Count“ – co tato volba znamená?
Agregační funkce Count v poli dotazu počítá počet neprázdných hodnot v tomto poli v příslušné
skupině jednoduchého dotazu, na kterém je daný seskupovací dotaz založen.
Ukažme si to na příkladu. Využijeme tuto funkci
k tomu, abychom v každé zemi spočítali počet
zákazníků, kteří mají fax.
Vytvořte jednoduchý dotaz s poli Zákazníci-Země a
Zákazníci-Fax, pak přidejte řádek „Souhrn:“, u pole
Fax vyberte funkci „Count“ a pojmenujte ho
PočetFaxů, vytvořte nové pole s výrazem
PočetZákazníků:Count(*), nastavte zde „Výraz“.
Podívejte se odpověď, porovnejte oba souhrny,
prohlédněte si řádek se Švýcarskem.
37
Volba „Výraz“ je určena pro případ, že v řádku „Pole:“ je nějaký výraz s agregací – viz například dotaz „Podíl
dopravného a ceny zboží 2“.
31
5.6 Doporučení pro použití průvodce
Pro dotaz se souhrny doporučuji spíše postupovat tak, jak jsme to dělali v případě našeho prvního
seskupovacího dotazu, a to nejprve vytvořit jednoduchý dotaz, a následně ho upravit v návrhovém
zobrazení na dotaz se souhrny.
Pro vytvoření základního jednoduchého dotazu můžeme použít průvodce jednoduchým dotazem.
Zopakujme a doplňme návod z předchozí kapitoly:
V prvním kroku průvodce vybereme pole,
•
jež chceme zobrazit do výsledku,
•
jež budeme potřebovat do výrazů,
•
podle kterých chceme řadit nebo seskupit nebo pro ně zadat kritéria
Do dotazu můžeme přidat pole, která nemusíme mít zobrazena ve výsledku, ale seskupování podle
nich dotaz zefektivní. V našem příkladu to bylo pole ČísloZaměstnance, protože to je klíčem
tabulky Zaměstnanci, a pro něj je v databázi vytvořen index. Seskupování pole indexovaného pole
je podstatně efektivnější.
Ve druhém kroku se vyhněme vytváření souhrnů průvodcem, a pokročíme nakonec, kdy dotaz
pouze pojmenujeme tak, jak se má jmenovat výsledný seskupovací dotaz.
V návrhovém zobrazení dotazu následně vytvoříme všechny výrazy, které eventuelně potřebujeme.
Pak přidáme řádek „Souhrn:“ 38 , v něm volíme
•
agregační funkci (Sum, Min, Max, Avg …) v polích, v nichž se má vypočítat souhrn
•
„Kde“ v polích, jež slouží pro zadání kritéria „před seskupením“, tedy kritéria, jež říká, co
se má do souhrnů započítat. V takovém poli nemůže být zaškrtnuto „Zobrazit:“.
•
„Výraz“ v případě, že jde o Count(*) nebo složitější výraz z agregačních funkcí
•
v ostatních polích necháme Seskupit
Dotazy generované v MS Access pomocí návrháře nejsou příliš efektivní, co se týče klauzule GROUP BY
v SQL-kódu. Vygenerovaný SQL-kód má v GROUP BY vše, co má „Seskupit“ v řádku „Souhrn:“ v návrhovém
zobrazení. Skutečné seskupování je však nutné pouze podle některých z nich, jako v našem příkladu pouze
podle ČísloZaměstnace, Year(datumObjednávky), Month(DatumObjednávky). – Pokud chcete vygenerovat
vhodnější SQL-kód, zvolte u ostatních polí „Výraz“ místo „Seskupit“ – pak ale takový dotaz nelze spustit jako
dotaz MS Access.
Jestliže vytváříte předávací SQL dotaz, dejte pozor – seskupování podle výrazů nemusí některé databázové
servery umět!
5.7 Omezení počtu řádků výsledku seskupovacího dotazu
Někdy chceme ve výsledku pouze ty řádky, v nichž vypočtený souhrn vyhovuje nějakému kritériu.
Takové kritérium prostě napíšeme do příslušného pole.
Například když chceme vybrat zákazníky, kteří v roce 1998 podali více než 3 objednávky,
sestavíme dotaz podle obrázku na následující straně nahoře.
Dalším příkladem je dotaz „Zákazníci podle nákupu v roce 1997-výběr1“ ve skupině Seskupovací.
Můžeme také podle agregované hodnoty řadit, a omezit počet výstupních řádků volbou „Nejvyšší
hodnoty“ (jak, viz str.26). Příkladem jsou dotazy „ Zákazníci podle nákupu v roce 1997-výběr2“ a
„Zákazníci podle nákupu v roce 1997-výběr3“.
38
Tlačítko
v panelu nástrojů, nebo menu Zobrazit-Souhrny, nebo z lokálního menu nad mřížkou návrhu.
32
5.8 Křížové dotazy
Pokud seskupování probíhá podle dvou hledisek, je možné uspořádat výsledek přehledněji, do tzv.
křížové tabulky.
Předveďme si to na druhé verzi našeho prvního seskupovacího dotazu, který pro každého
zaměstnance vypočítává tržby za jednotlivé měsíce roku 1998 (viz str.29). Výsledek může být
uspořádán i takto:
ČísloZam Příjmení Jméno
1
2
3
4
5
1 Davolio
Nancy 202 884,03 Kč 278 687,62 Kč 620 686,25 Kč 314 680,63 Kč 162 936,77 Kč
2 Fuller
Andrew 108 777,75 Kč 578 188,75 Kč 348 441,00 Kč 774 757,00 Kč 48 249,37 Kč
3 Leverling Janet
642 625,19 Kč 538 506,00 Kč 409 003,13 Kč 323 933,88 Kč
4 Peacock Margaret 481 149,25 Kč 266 076,50 Kč 207 461,25 Kč 248 442,75 Kč 150 268,75 Kč
5 Buchanan Steven 296 070,00 Kč 134 426,50 Kč 60 050,87 Kč 5 250,00 Kč
6 Suyama
Michael
7 King
Robert
8 Callahan Laura
9 Dodsworth Anne
46 870,75 Kč 48 835,00 Kč 126 724,37 Kč 131 173,75 Kč
161 750,00 Kč 157 928,31 Kč 154 658,75 Kč 714 764,06 Kč 29 020,87 Kč
281 592,81 Kč 2 650,00 Kč 518 203,25 Kč 344 427,50 Kč 67 865,00 Kč
133 832,97 Kč 480 083,50 Kč 176 124,98 Kč 237 537,50 Kč
Zde ČísloZaměstnace, Příjmení, Jméno tvoří hlavičku řádků, měsíce tvoří hlavičky sloupců, a
souhrnná tržba je hodnotou, která je vyplňována do tabulky do příslušného
řádku a sloupce.
Toho docílíme, když nejprve přepneme typ dotazu na „Křížový dotaz“ 39 .
Tím se do mřížky návrhu dotazu přidá řádek „Křížová tabulka:“. V něm
zvolíme „hlavička řádku“ v polích ČísloZaměstnace, Příjmení a Jméno,
„hlavička sloupce“ v poli měsíc, a „hodnota“ v poli Tržba:
Pro tvorbu křížových tabulek existuje v MS Access průvodce křížovým dotazem. Pro jeho použití je
nejprve potřeba mít uložen dotaz, na základě kterého bude křížová tabulka vytvořena. Pro nás to
může být buď, stejně jako předtím, druhá verze našeho prvního seskupovacího dotazu ze str. 29,
nebo dokonce pouhý jednoduchý dotaz jako je následující:
39
Nabídka Typ dotazu
v panelu nástrojů nebo menu Dotaz.
33
Vytvořte tento dotaz a uložte ho (pojmenujte např. Pkt 40)! Nyní jsme připraveni spustit Průvodce
křížovým dotazem.
Všechny průvodce pro tvorbu dotazů naleznete v seznamu „Nový dotaz“ nabídnutému po stištění
tlačítka
nahoře v okně Databáze pro objekty Dotazy:
První krok Průvodce křížovým dotazem se vás zeptá, kde je tabulka či dotaz, jež se má zpracovat do
křížové podoby. Pro náš příklad přepněte na
a v seznamu nahoře vyberte prve pro naše
účely uložený dotaz (možná jste ho pojmenovali Pkt). Stiskněte tlačítko „Další“.
V následujícím kroku vyberete hlavičky řádků, v našem případě to budou
.
Přejdeme na další krok průvodce, v něm vybereme hlavičku sloupců – nyní to bude
DatumObjednávky.
Následující krok průvodce se objevuje v závislosti na tom, zda jsme prve vybrali nějaké pole typu
datum, a to jsme opravdu vybrali – bylo to DatumObjednávky. Podobně jako v průvodci pro
souhrnný dotaz se nám nabízí možnosti seskupení podle nabízených časových intervalů – vyberme
„Měsíc“.
Další krok průvodce se ptá, co se bude vyplňovat jako hodnota do křížové tabulky – vyberme
Mezisoučet. Dále zde vybereme agregaci, která se má počítat – vybereme „Součet“. Ještě si
všimněte zaškrtnutí vlevo „Ano, zahrnout součty řádků“ – to ponecháme. Dialog nyní vypadá jako
obrázek nahoře na následující straně.
V posledním kroku pouze dotaz pojmenujte.
Porovnejte získaný výsledek s dotazem, jehož návrh jsme sami upravili do podoby křížové tabulky.
40
Jako zkratka za „Pro křížovou tabulku“ – ☺.
34
Nepodstatný rozdíl je výrazu pro měsíc. Další drobný rozdíl je v počtu sloupců – ten je zajištěn
vyjmenováním hodnot do „Hlavičky sloupců“ ve vlastnostech dotazu 41. Podstatný rozdíl je ve
sloupci, který zajišťuje souhrny pro celé řádky výsledné křížové tabulky. Tento sloupec má
pojmenování (průvodce vytvořil pojmenování „Celkem Mezisoučet“), jako pole je vybráno pole,
jež se má agregovat, v řádku „Souhrn:“ má vybranou agregační funkci, a v řádku „Křížová
tabulka:“ má volbu „Hlavička řádku“. Toto můžeme sami vytvořit ve vlastním návrhu dotazu
přidáním dalšího sloupce do mřížky:
V databázi Řešení jsou oba postupy demonstrovány na příkladech dotazů „Tržby zaměstnanců po
čtvrtletích 2_křížový dotaz“ a „Tržby zaměstnanců po čtvrtletích 3“.
5.8.1 Pole křížového dotazu
Shrňme: křížový dotaz je typ dotazu MS Access. V křížovém dotazu může být více polí jako
hlavička řádku. Některé z nich mohou být agregací nějakého pole, ty pak představují souhrn pro
celý řádek výsledku. Jedno pole musí být hlavička sloupce, a nesmí jich být víc. Jedno pole musí
být „hodnota“, a opět jich nemůže být víc.
Kód vygenerovaný pro křížový dotaz není SQL-kódem, nelze ho poslat běžnému databázovému serveru! Pokud
chcete zpracovat výsledek dotazu předaného databázovému serveru do podoby křížové tabulky, musíte tento
jako mezivýsledek zpracovat dalším, tentokrát MS Access křížovým dotazem, podobně jak to dělá průvodce
křížovým dotazem.
5.8.2 Datový list křížového dotazu
V datovém listu křížového dotazu je možno dělat úpravy formátu, jako s jinými dotazy. Zejména je
zajímavá možnost ukotvení sloupců s hlavičkami řádků, a možnost uspořádat řádky podle nějakých
vybraných sloupců.
41
Menu Zobrazit-Vlastnosti, nebo lokální menu, nebo tlačítko
aktuálnímu objektu.
35
v panelu nástrojů. Dialog Vlastnosti se přizpůsobuje
5.9 Kontingenční tabulky, kontingenční grafy
MS Access 2002 nabízí možnost zpracování výsledku dotazu do podoby kontingenční tabulky nebo
kontingenčního grafu. V databázi Řešení jsou některé příklady, vytvořené kontingenční tabulky
jsou ve skupině pojmenované „Kontingenční tabulky“, kontingenční grafy jsou vytvořeny pro
dotazy, jež mají v popisu poznámku „kontingenční graf“.
Nabídka kontingenční tabulky a kontingenčního grafu je v menu Zobrazit (nebo v panelu nástrojů
v přepínači zobrazení) pro právě otevřené okno dotazu.
Pro první seznámení s kontingenčními tabulkami v MS Access je v databázi Řešení připraven dotaz
„Podrobný přehled prodejů“. Importujte si ho (a pokud nemáte, tak ještě „Jména Zaměstnanců“) do
svého projektu.
Otevřte prve importovaný dotaz „Podrobný přehled prodejů“, přepněte zobrazení na Zobrazení
kontingenční tabulky. Zobrazte seznam polí
:
Nyní máte různé možnosti, co zvolit do jednotlivých
„dimenzí“ kontingenční tabulky.
Můžete například:
do oblasti řádků přidat „Země“ a „Firma“,
do oblasti sloupců přidat „Datum objednávky po
měsících“,
do oblasti filtru přidat „Název kategorie“, „Název
výrobku“ a „Zaměstnanec“.
Do datové oblasti i do podrobných dat přidejte „Výsledná
cena“.
Seznam polí potom zavřete – můžete ho vždy znovu otevřít
– budete mít lepší výhled.
Pokud se vám roky špatně zobrazují,
asi takto:
,
a
klikněte pravým tlačítkem myši na
vyberte „Vlastnosti“. V dialogu „Vlastnosti“
přepněte na kartu „Formát“. Zde přepište
rrrr
na
yyyy
a pak dialog „Vlastnosti“ zavřete.
Kontingenční tabulka nyní vypadá takto:
36
Nyní můžete zkoušet rozbalovat a sbalovat pomocí a ,
,
, atd.) můžete zkoušet různě upravovat, například takto:
nabídky u polí (
nebo
Pak bude zobrazen pouze výběr.
Zkoušejte také lokální menu na různých objektech (po ukázání myší se vám zobrazí návěští
objektu) … Zde naleznete též odebrání pole z kontingenční tabulky (zůstane ovšem v seznamu
polí).
Kontingenční tabulky v MS Access2002 nabízejí podobné možnosti, jako v MS Excel, uživatelská
přívětivost je v MS Access horší, ale možnost zobrazení podrobností i souhrnů je v MS Access2002
navíc. O možnostech v MS Excel viz kapitolu 6 Souhrny pomocí datových kostek.
5.9.1 Kontingenční grafy
Data kontingenční tabulky lze zobrazit i do grafu, po přepnutí zobrazení do Zobrazení
kontingenčního grafu.
V zobrazení kontingenčního grafu můžete měnit typ grafu, zobrazovat či skrýt legendu, volit řady
podle sloupců či podle řádků – vše v panelu nástrojů nebo v menu Kontingenční graf
Výběr polí nejlépe upravíte v kontingenční tabulce.
Příklad grafu ukazuje obrázek nahoře na následující straně. Další příklady kontingenčních grafů
naleznete v databázi Řešení u některých dotazů, u kterých je odpovídající poznámka v popisu.
37
- výběr zemí:
5.10 Zvláštní případy seskupovacích úloh
5.10.1 Dotazy na počet různých hodnot
Dotazy, ve kterých chceme zjistit počet různých hodnot vyhovujících nějakým požadavkům,
vyžadují v MS Access specifický postup. Tento postup spočívá v tom, že si nejprve připravíme
seznam požadovaných hodnot bez opakování, a poté pro tento seznam použijeme agregaci Count.
Ukažme si to na příkladu. Představme si, že chceme pro každý druh výrobku spočítat počet
zákazníků, kteří tento druh výrobku nakupují. Nejprve si tedy připravíme pro každý výrobek
seznam zákazníků, kteří daný výrobek někdy nakoupili, a zamezíme opakování. Toto zajistíme
například dotazem:
seznamVýrobkyZákazníci
Výsledkem je tabulka:
ČísloVýrobku se zobrazuje
jako Výrobky.NázevVýrobku
s titulkem Výrobek,
KódZákazníka jako Zákazníci.Firma
s titulkem Zákazník.
Výrobek
Chai
Chai
…
Chang
Chang
Zákazník
Berglunds snabbköp
Blondel pere et fils
…
Antonio Moreno Taquería
Around the Horn
…
…
Aniseed Syrup Ana Trujillo Emparedados y helados
(Pro vysvětlení viz podkapitolu 2.4 Struktura Aniseed Syrup Berglunds snabbköp
…
…
tabulek v databázi Northwind na str.10 )
38
Výsledek předchozího dotazu nyní seskupíme podle Výrobků, a spočítáme počet řádků v každé
skupině – zvolíme Nový dotaz v návrhovém zobrazení, v dialogu Zobrazit tabulku přepneme na
Dotazy a vybereme prve vytvořený mezivýsledek, pak v návrhu dotazu vytvoříme souhrn:
Výsledek:
Výrobky-početZákazníků
Výrobek
početZákazníků
Chai
31
Chang
28
Aniseed Syrup
10
Chef Anton's Cajun Seasoning
17
Chef Anton's Gumbo Mix
9
...
…
V SQL existuje agregační funkce COUNT DISTINCT, kterou lze použít pro tento typ úloh, avšak MS Access
tuto funkci nepodporuje. Úloha zde předvedená by byla řešena SQL-kódem:
SELECT R.ČísloVýrobku, COUNT DISTINCT(O.KódZákazníka) AS PočetZákazníků
FROM Rozpis_objednávek R INNER JOIN Objednávky O ON
R.ČísloObjednávky=O.ČísloObjednávky
GROUP BY V.ČísloVýrobku
počet zákazníků
V databázi řešení je další příklad na výpočet počtu různých hodnot, tvoří jej dotazy „Sortiment
zákazníků“ a „Velikost sortimentu zákazníků“ ve skupině Seskupovací. Dotaz „Sortiment
zákazníků“ ukazuje jinou možnost pro zamezení opakování dvojic (zákazník-výrobek), a to
seskupením podle polí (KódZákazníka a ČísloVýrobku). Tento příklad pokračuje ještě o jeden krok
dále, pro zjištění statistiky velikosti sortimentu zákazníků (dotaz „Frekvence velikosti sortimentu“):
8
7
6
5
4
3
2
1
0
0
10
20
30
40
50
60
velikost sortimentu
5.10.2 Agregace First, Last
MS Access nabízí dvě specifické agregace, a to First a Last. Pro jejich smysluplné použití je třeba
zajistit, aby řádky základní tabulky, ve které se takový souhrn počítá, měly žádoucí pořadí.
Jedním příkladem je dotaz „Poslední cena“ ve skupině „Seskupovací“. Jeho smysl je zjistit, zda
jednotková cena uvedená v tabulce Výrobky odpovídá ceně naposled účtované v objednávkách.
Důvěra v pořadí řádků vzniklých spojením tabulek Výrobky a Rozpis objednávek je ovšem
založena na znalostech postupů, jak se takové propojení realizuje, což vysoko přesahuje rámec
těchto skript. Obecně tedy nelze předpokládat, v jakém pořadí bude MS Access procházet řádky
tabulek.
39
Jiným příkladem ukazujícím jak zajistit pořadí pro použití funkcí First nebo Last jsou dotazy „Počty
zákazníků nakupujících výrobky v zemích“ (to je vytvářecí dotaz 42, tedy odpověď na něj je
ukládána jako skutečná tabulka v databázi – zde je to „Počty_zák_v_zemích_pro_výrobky“) a
následující, který zpracuje výsledek předchozího, dotaz „Statistika počtu zákazníků v zemích pro
výrobky“.
Podobně lze například vytvořit výsledek
Nejlepší prodejci měsíců
rok měsíc
1996
7
1996
8
1996
9
1996
10
1996
11
1996
12
1997
1
1997
2
…
…
nejlepší zaměstnanec jeho/její tržba počet objednávek
Peacock, Margaret
296 511,25 Kč
7
Callahan, Laura
206 595,00 Kč
6
Davolio, Nancy
166 275,00 Kč
5
Peacock, Margaret
342 974,25 Kč
8
Peacock, Margaret
282 785,50 Kč
5
Buchanan, Steven
250 770,50 Kč
3
Peacock, Margaret
593 411,62 Kč
8
Peacock, Margaret
303 049,87 Kč
6
…
…
…
Stejného výsledku však lze dosáhnout i složením několika mezivýsledků. Nejprve:
Potom:
A konečně:
42
Jak pracovat s vytvářecími dotazy viz kapitolu Akční dotazy.
40
Pro dosažení stejného výsledku lze použít též skalární pod-dotazy, o tom viz kapitolu Mezivýsledky. Takové
řešení je ale podstatně obtížnější.
41
6 Souhrny pomocí datových kostek
V programu MS Excel lze pomocí kontingenčních tabulek a kontingenčních grafů zobrazit a
prohlížet data z různých dostupných databází. Tato data lze navíc uspořádat do datových kostek.
Datová kostka je vícedimenzionální databázový útvar, v němž jsou data organizována analogicky
ke křížovým tabulkám. Zatímco křížové tabulky mají dimenze pouze dvě, datové kostky jich
mohou mít více. Při prohlížení si pak můžeme vybrat, které dimenze chceme zobrazit. Navíc, každá
dimenze může mít hierarchické členění, umožňující na požádání zobrazit buď detailní data, či jejich
souhrny v nějaké úrovni členění dimenze. Například můžeme mít souhrny pro celé kategorie
výrobků, nebo detailní data pro jednotlivé výrobky.
Vyrobíme si datovou kostku z dat vzorové databáze Northwind, a jejím prohlížením v kontingenční
tabulce programu MS Excel získáte představu o tom, co taková datová kostka je a k čemu slouží.
6.1 Datová kostka z dat Northwind
V programu MS Excel otevřte nový sešit. V menu zvolte Data-Importovat externí data-Nový
databázový dotaz.
V následujícím dialogu „Zvolit zdroj dat“
vyberte Databáze MS Access*, stiskněte
tlačítko „OK“.
V dialogu „Vybrat databázi“ najděte
vzorovou databázi Northwind, potvrďte.
Spustí se průvodce dotazem, v jehož prvním
kroku vyberte sloupce:
Kategorie-NázevKategoie
Objednávky-DatumObjednávky
Rozšířené podrobnosti objednávek-VýslednáCena
Výrobky-NátevVýrobku
Zákazníci-Firma a Zěmě
Zaměstnaci-Příjmení
Další dva kroky průvodce („filtrování dat“ a
„pořadí řazení“) přeskočte.
V dokončení průvodce vyberte:
.
Tlačítkem
ukončete průvodce
dotazem,
a začne Průvodce vytvořením datové krychle
OLAP.
Zde, pokud chcete, můžete vyvolat Nápovědu
a přečíst si více o datových kostkách OLAP,
nebo můžete postoupit přímo dále.
42
V prvním ze tří kroků průvodce
nastavíte:
(Toto nastavení pravděpodobně
průvodce sám nabídl).
V následujícím, druhém, kroku průvodce vytvoříte
strukturu podle obrázku →
(Nižší úroveň hierarchie vytvoříte přetažením
příslušného pole na symbol příslušného nadřazeného
pole, tedy např. přetažením
)
Dimenze DatumObjednávky se rozbalí sama na RokČtvrtletí-Měsíc…)
,a
V posledním, třetím, kroku průvodce vyberte
vyberte umístění pro soubor krychle (nejlépe složku, ve které máte své pokusy k těmto skriptům),
soubor krychle pojmenujte například Northwind1. Po stištění tlačítka „Dokončit“ v průvodci jste
požádáni o umístění souboru dotazu, jenž byl sestaven předchozím průvodcem. I tento soubor
vhodně umístěte (nejlépe na stejné místo, jako soubor krychle), dotaz pojmenujte například
Northwind1.
Objeví se dialog „Průvodce kontingenční tabulkou a grafem (3/3)“, zde potvrďte umístění na
existující list. V listu sešitu MS Excel máte nyní
DatumObjednávky, NázevKategorie, Příjmení a Země jsou „dimenze“, které můžete umístit do
oblasti řádků, sloupců, nebo stránek. Například Země do oblasti řádků, DatumObjednávky do
oblasti sloupců, NázevKategorie a Příjmení do oblasti stránek:
43
Součet Z VýslednáCena je jediné pole vhodné pro umístění do datové oblasti, umístěte ho. Seznam
polí kontingenční tabulky nyní můžete zavřít.
Podobně jako v kontingenčních tabulkách programu MS Access nyní můžete zobrazovat detaily
nižších úrovní hierarchie dimenzí, nebo nastavovat kritéria výběru, například:
apod.
Přepnutím v panelu nástrojů „Kontingenční tabulka“ na
listě, tento můžete různě upravovat…
vytvoříte kontingenční graf na novém
Při zavírání programu MS Excel nemusíte sešit ukládat, k opětovnému zobrazení kontingenční
tabulky slouží soubor dotazu OLAP (v našem případě Northwind1.oqy 43).
6.2 Jiná kostka z Northwind
Pro data ze vzorové databáze Northwind můžeme vytvořit ještě jinou datovou kostku, a to pro
Dopravné a s ním související dimenze. Ty mohou být například Přepravci-Firma (kdo zboží
převážel), Objednávky-ZeměPříjemce (kam se zboží vezlo), DatumObjednávky (kdy se zboží
vezlo).
Příslušnou datovou kostku a dotaz OLAP můžete nazvat Northwin2. Můžete například zobrazit
kontingenční grafy pro souhrny přepravného do Evropy (výběr více zemí v oblasti stránek), nebo do
Severní Ameriky apod.:
450000
400000
350000
300000
1998
250000
1997
200000
1996
150000
100000
50000
0
Federal Shipping
43
Speedy Express
United Package
V tomto souboru je přímo zakódována cesta (tzv. absolutní umístění) ke zdroji dat i k souboru datové krychle.
44
7 Přehledy a souhrny ještě jinak
Výrazy a souhrny v tabulkách lze pohodlně počítat také pomocí tabulkového kalkulátoru. Nejsnazší
okamžitá cesta je zkopírovat tabulku či výsledek dotazu ze zobrazení datového listu 44 a vložit je do
sešitu tabulkového kalkulátoru.
Jiný postup, umožňující aktualizaci dat v tabulkovém kalkulátoru, pokud se zdrojová data
v databázi změní, je v programu MS Excel přes volbu Data-Importovat externí data, kde volíme
Importovat data, pokud chceme načíst data z tabulky či dotazu nějaké databáze, nebo volíme Nový
databázový dotaz, pokud žádaný dotaz ve zdrojové databázi není, a pak ho pomocí průvodce
můžeme sestavit 45.
Běžné výpočty v tabulkovém kalkulátoru čtenář jistě zvládne. Připomeňme, že program MS Excel
nabízí v menu Data také některé „databázové“ služby, pro seznámení s nimi existují jiné studijní
materiály, než jsou tato skripta. Pro ukázku méně obvyklých výpočtů si můžete prohlédnout sešity
„Průběh cen“ a „Opakování nákupů“.
V programu MS Access lze zobrazit souhrnná i detailní data také za pomoci tzv. vnořených
datových listů. Ve vzorové databázi Northwind jste si prohlédli v datovém listu tabulky Objednávky
její vnořený datový list z tabulky Rozpis objednávek (tlačítko se znakem + ve voliči záznamů).
Také tabulky Dodavatelé, Kategorie, Přepravci, Výrobky, Zákazníci a Zaměstnanci mají vnořené
datové listy (vnořený datový list může sám mít vlastní vnořený datový list, pak jde o kaskádovité
vnoření). V databázi Řešení je ukázka ve skupině Seskupovací, dotaz „Souhrny podle zemí“. Ten
má vnořený datový list předchozího dotazu „Souhrny zákazníků“, jenž sám má zase vnořený datový
list dotazu „Přehled nákupů zákazníků“ ze skupiny „Jednoduché“.
Porovnejte sérii obrázků na následující straně. Dotaz „Souhrny zákazníků“ má i pole Země, to
proto, aby bylo možno určit, ke kterému řádku ze „Souhrny podle zemí“ patří které řádky ze
„Souhrny zákazníků“ – pole Země je v obou společné, tzv. propojovací. Také si všimněte, že ve
vnořeném datovém listu v „Souhrny podle zemí“ se propojovací pole Země nezobrazuje, není to
nutné. – Podobně je tomu s dotazy „Souhrny zákazníků“ a „Přehled nákupů zákazníků“, ty mají
společná pole Země a Firma.
Jak se datové listy vkládají? Prohlédněte si dotaz „Souhrny zákazníků“:
Pokud zobrazení přepnete na zobrazení datového listu,
pak v menu zvolte Vložit-vnořený datový list →
Nebo přepněte na návrhové zobrazení, a vyvolejte
dialog „Vlastnosti“ dotazu↓
Pokud je více propojovacích polí, musíme jejich
44
Pomocí menu Úpravy-Vybrat všechny záznamy, nebo pokud chceme pouze některé řádky, vyberte je pomocí voliče
záznamů v levé části zobrazení datového listu. Potom kopírujte běžnými postupy v MS Windows.
45
Používá se přitom modul programu MS Query.
45
seznam vypsat a oddělit středníky.
společná pole,
sloužící k propojení
ve vnořeném datovém
listu se propojovací
pole nezobrazuje
propojovací pole
jsou zde
Země a Firma
Další možnost zobrazit zároveň detaily i souhrny nabízejí tiskové sestavy, o nich viz kapitolu
12 Sestavy. Pro základní představu o možnostech souhrnů a výpočtů v sestavách si prohlédněte
náhledy 46 sestav „Prodeje zaměstnanců v posledním čtvrtletí“, „Přehled nákupů zákazníků“ a
„Souhrny podle zemí v jednotlivých letech“ v databázi Řešení ve skupině „O sestavách“.
46
Poklepání nebo Enter na ikonu sestavy nebo tlačítko
v okně Databáze.
46
8 Mezivýsledky
Někdy si pro dotaz, který máme na mysli, musíme nejprve vytvořit tabulku, kterou má tento dotaz
zpracovat. Zcela výjimečně je potřeba uložit takovou tabulku do databáze, většinou je možné a
zcela vyhovuje použít výsledek jiného dotazu. Tak se ten jiný dotaz stává mezivýsledkem k našemu
cíli.
Všechny dotazy, v nichž jsou použity pomocné dotazy Rozšířené podrobnosti objednávek a
Mezisoučty objednávek jako tabulky v návrhu dotazu, jsou příklady takového postupu. Ovšem tyto
dva pomocné dotazy byly zahrnuty do relací, a jsou nahlíženy jako skutečné tabulky databáze.
Není vždy nutné zahrnovat mezivýsledky do relací, spíše naopak. Pak je ovšem nutno zajistit
správné propojení mezivýsledků s ostatními tabulkami v návrhu dotazu.
8.1 Příklad propojení mezivýsledků
Představme si, že potřebujeme přehled, ve kterém budeme mít pro každého dodavatele
počet výrobků, které tento dodavatel dodává, a celkovou tržbu za výrobky tohoto dodavatele.
Pro každého dodavatele tedy potřebujeme spočítat dva souhrny. Chceme je dát nakonec dohromady,
ale každý z nich je třeba dělat zvlášť.
První z nich bude dosažen dotazem:
Druhý dotazem:
(Zkuste, že count(*) v dotazu „tržbyDodavatelů“ dá jiná čísla, než v dotazu „počtyVýrobkůDodavatelů“. Nelze tedy oba souhrny počítat najednou.)
Nyní je třeba propojit výsledky obou dotazů, takto:
počtyVýrobkůDodavatelů
Dodavatel
Exotic Liquids
New Orleans Cajun Delights
Grandma Kelly's Homestead
Tokyo Traders
Cooperativa de Quesos 'Las
Cabras'
Mayumi's
Pavlova, Ltd.
Specialty Biscuits, Ltd.
PB Knäckebröd AB
…
tržbyDodavatelů
početVýrobků
1
4
3
3
2
Dodavatel
Exotic Liquids
New Orleans Cajun Delights
Grandma Kelly's Homestead
Tokyo Traders
Cooperativa de Quesos 'Las
Cabras'
Mayumi's
Pavlova, Ltd.
Specialty Biscuits, Ltd.
PB Knäckebröd AB
…
3
5
4
2
…
47
Tržba
408 899,00 Kč
779 199,75 Kč
1 048 832,50 Kč
763 158,50 Kč
628 985,75 Kč
368 418,86 Kč
2 661 494,36 Kč
1 156 099,50 Kč
293 101,50 Kč
…
Je tedy potřeba vložit oba předchozí dotazy jako tabulky do dalšího dotazu (jak? – viz podkapitolu
4.7 Přidávání tabulek do návrhu dotazu na str.25), a pak je propojit. Nejprve dostaneme do návrhu
dotazu tabulky nepropojeny:
Kdybychom je nechali bez propojení, bude se do výsledku propojovat každý (dodavatel) s každým
(dodavatelem), zkuste výsledek:
Dodavatel
Exotic Liquids
New Orleans Cajun Delights
Grandma Kelly's Homestead
Tokyo Traders
Cooperativa de Quesos 'Las Cabras'
Mayumi's
Pavlova, Ltd.
…
Exotic Liquids
…
Dodavatel
Exotic Liquids
Exotic Liquids
Exotic Liquids
Exotic Liquids
Exotic Liquids
Exotic Liquids
Exotic Liquids
…
Tokyo Traders
…
Takže propojení je třeba vytvořit – je však třeba si rozmyslet, jaké propojení (mezi tabulkami
výsledků předchozích dotazů) odpovídá našemu cíli: cílem je spojit dohromady řádky, ve kterých je
stejný dodavatel, jako je to naznačeno mezi tabulkami na předchozí straně. Pravidlo, které říká, co
se má spolu spojovat, je že ČísloDodavatele z „tržbyDodavatelů“ je stejné jako ČísloDodavatele
z „počtyVýrobkůDodavatelů“. Spojíme tedy tato pole čarou, podobnu relacím (srovnej str.9),
tažením myši:
tažení myši
(Porovnejte výsledek nyní!) V mřížce návrhu pak vybereme pole z mezivýsledků do konečného
výsledku:
Příkladem v databázi řešení je dotaz „Tržby za výrobky porovnání 1997 a 1998 Q1“, ve kterém je
navíc z polí mezivýsledků vypočítáván výraz „podíl“ (všimněte si, že má formát pole „procenta“).
Pokud bychom nyní chtěli v našem příkladu přidat ještě nějaké informace o dodavateli, připojíme je
tam podobně –
48
– například kontaktní
osoba v dodavatelské
firmě je v tabulce
Dodavatelé,
můžeme ji připojit:
Přidejme k našemu přehledu ještě informaci o počtu zákazníků, kteří nakupují výrobky tohoto
dodavatele. Ve shodě s postupem vysvětleným v sekci 5.10.1 Dotazy na počet různých hodnot na
str. 38 vytvoříme tyto dva další mezivýsledky:
a pak do našeho konečného přehledu připojíme ještě
dotaz „počtyZákazníkůDodavatelů“:
49
8.2 Mezivýsledek pro použití v kritériu
Někdy si vytvoříme seznam hodnot, které chceme použít v kritériu následujícího dotazu pro
porovnání In(seznam_hodnot). Tento seznam může být i výsledkem nějakého předchozího
dotazu. Místo toho, abychom jednotlivé hodnoty seznamu opisovali do kritéria, můžeme využít
tabulky odpovědi dotazu vytvářejícího ten seznam.
Například vybereme pět nejméně prodávaných výrobků, a chceme vědět, kteří zákazníci tyto
výrobky kupovali. Nejprve tedy sestavíme dotaz vybírající ty výrobky:
← Dál sestavíme dotaz pro výběr zákazníků,
v němž bude pole ČísloVýrobku pro kritérium
k vymezení výrobků.
Kritérium vymezující výrobky můžeme nyní napsat
takto →
To je jistě velmi pracné, navíc předchozí dotaz
vytvářející seznam výrobků v odpovědi
nezobrazoval čísla výrobků, ale jejich názvy, takže
bychom ho museli upravit…
←Také můžeme místo toho napsat SQLkód.
Nejlepší řešení však ukazuje obrázek na
následující straně!
50
Skutečně, propojení mezi tabulkami výsledků dotazů „Rozpis objednávek“ a „NejhoršíVýrobky“
realizované prostřednictvím pole ČísloVýrobku omezí výsledek pouze na ty řádky, v nichž
ČísloVýrobku je ze seznamu nejhorších výrobků. (Na začátku kapitoly 10 Polospojení je k tomuto
podrobný výklad.)
Takto získaný seznam můžeme použít dál, například zjistit podíl tržby těchto zákazníků na celkové
tržbě, a tím zjistit, jak jsou tito zákazníci pro nás významní…:
← Toto je zvláštní agregační dotaz, kde není ani jedno
„Seskupit“. V takovém případě se souhrn počítá pro celou
tabulku.
Vypočtené číslo se dá opsat do výrazu následujícího dotazu, je
však možno využít výsledek i takto, a to bez propojení: ↓
V kapitole 10 Polospojení je ukázáno, jak do našeho přehledu zahrnout všechny zákazníky, a do
výsledku přidat informaci, zda do „ZákazníciNejhoršíchVýrobků“ patří nebo nepatří.
V databázi Řešení jsou ve skupině „Poddotazy“ k tomuto tématu příklady dotazů „Zákazníci
nakupující deset nejdražších výrobků“ a „Tržby za výrobky od největších zákazníků“.
Dotaz „Tržby za výrobky od největších zákazníků :( “ je navržen s kritériem in (select…). Takové dotazy jsou
v MS Access obecně pomalejší, než jim odpovídající verze s „kritériem propojením“. Tento konkrétní dotaz
specielně je v MS Access natolik špatně optimalizován, že jeho provádění trvá řádově minuty.
Dotaz „Porovnání tržeb za výrobky“ v databázi Řešení porovnává celkové tržby za jednotlivé výrobky s tržbami
od největších zákazníků. Protože u některých výrobků nebyla žádná tržba od největších zákazníků, jsou
v návrhu tohoto dotazu tabulky použitých mezivýsledků polospojeny.
51
8.3 Skalární pod-dotazy
Tento část výkladu se týká poměrně sofistikovaného a náročného použití „mezivýsledků“. Většinou
lze však použít snazší postupy, a ty zde také ukážeme.
Postup ukážeme na úloze pro data ze vzorové databáze Northwind: Pro každý výrobek nalezněte
zemi, ve které byla za ten výrobek největší tržba! (Obecně jde o úlohu v každé skupině nalézt
nejlepšího/nejhoršího …)
Vysvětlíme si nejprve snazší postupy. První z nich využije agregační funkci „Fist“, nabízenou
programem MS Access. Jak je vysvětleno v kapitole 5 Seskupovací dotazy, podkapitole 5.10
Zvláštní případy seskupovacích úloh, v sekci 5.10.2 Agregace First, Last (zde je odkaz na
analogickou úlohu), je potřeba zajistit pořadí zpracovávaných řádků, což většinou znamená
mezivýsledek uložit jako tabulku do databáze.
Sestavíme tedy vytvářecí dotaz (o vytvářecích dotazech viz kapitolu 13 Akční dotazy):
Výsledek tohoto
dotazu uložíme do
tabulky „tržbyvýrobky-země“.
Tabulku „tržby-výrobkyzemě“ zpracujeme pomocí
agregační funkce „First“:
Nevýhodou tohoto prvního postupu je nutnost ukládat mezivýsledek jako tabulku, dále je to specifičnoust
funkce „Fist“, kterou běžné SQL databáze nepodporují.
8.3.1 Alternativa pomocí více mezivýsledků
Další alternativa postupu ke stejnému cíli používá více mezivýsledků.
První je podobný jako prve, ale není nutno v něm řadit a není nutno výsledek dotazu ukládat jako
tabulku (první obrázek na další straně).
V následujícím kroku nalezneme pro každý výrobek nejvyšší tržbu v jednotlivé zemi (druhý
obrázek).
Konečně v posledním kroku porovnáním nalezneme zemi, ve které ta nejvyšší tržba byla (třetí
obrázek).
52
8.3.2 SQL SELECT jako výraz pro pole dotazu
Poslední alternativa postupu je ukázána v databázi Řešení, ve skupině „Poddotazy“, jako dotaz
„Země s největší tržbou pro jednotlivé výrobky“ – toto řešení je však velmi sofistikované, používá
SQL-kód v polích návrhu dotazu, odtud název této sekce 47. Jak předchozí výklad ukázal, většinou
lze výsledku dosáhnout příjemnější cestou.
Podejme vysvětlení k ukázce v databázi Řešení. Dva dotazy „pom1“ a pom2“ jsou pomůckou k vygenerování
SQL-kódu, jenž je pak použit v dotazu „Země s největší tržbou pro jednotlivé výrobky“ v polích „Země“ a
„Tržba“. Oba pomocné dotazy jsou parametrické, parametry v nich jsou myšleny jako hodnoty z běžných řádků
tabulky Výrobky zpracovávané dotazem „Země s největší tržbou pro jednotlivé výrobky“.
(Pokud byste chtěli takovýto postup používat obecně, museli byste v některých případech použít i aliasy pro
tabulky v pomocných dotazech.)
47
SQL-kód použitý jako výraz pro pole přestavuje pod-dotaz, jenž vrací jedinou hodnotu – tabulku s jediným řádkem a
jediným sloupcem. Tento pod-dotaz je tedy „skalární“.
53
9 Dotazy na to co v databázi není
Zvláštní skupinu úloh tvoří požadavek zjistit, která fakta daného typu a vlastností v databázi nejsou.
Protože formulovat takové dotazy je poměrně obtížné, přestože jsou potřebné, nabízí pro ně
program MS Access průvodce. Je to „Průvodce vyhledávacím dotazem na chybějící záznamy“
v okně Databáze pro objekty Dotazy. Před jeho použitím je
dostupný po stištění tlačítka
obvykle třeba si připravit jeden nebo i dva dotazy jako mezivýsledky.
Vysvětlíme si to na příkladu: chceme zjistit, kteří zákazníci v posledních dvou měsících nepodali
žádnou objednávku. K této úloze máme v databázi tabulku Zákazníci, v níž jsou všichni zákazníci,
tedy i ti, které hledáme. Dále si musíme připravit dotaz, jenž nám poskytne seznam těch zákazníků,
kteří naopak v dotyčných dvou měsících nějakou objednávku podali – o tom máme záznamy
v tabulce Objednávky:
Poznámka k datu: v databázi Northwind končí čas
v květnu 1998…
Pro zvýšení efektivity výsledného dotazu je možno v tomto pomocném dotazu nastavit Jedinečné hodnoty.
Nyní jsme připraveni použít Průvodce vyhledávacím dotazem na chybějící záznamy:
V jeho prvním kroku máme vybrat tabulku nebo dotaz, mezi jehož řádky lze nalézt hledané
záznamy („kde jsou všichni, které hledáme“), což je v našem případě tabulka Zákazníci.
Ve druhém kroku průvodce pak máme vybrat tabulku nebo dotaz, použitelný jako seznam hodnot
k vyškrtnutí z předchozí tabulky nebo dotazu (ze „seznamu všech“).
Ve třetím kroku se průvodce ptá, co má v předchozích dvou seznamech porovnávat - v našem
případě má porovnávat kódy zákazníků v tabulce Zákazníci s kódy zákazníků seznamu
„TiCoObjednali“.
V následujícím kroku se průvodce ptá, která pole chceme ve výsledku. V našem příkladu vyberte
např. KódZákazníka, Firma, Země.
V posledním kroku se průvodce pouze zeptá, jak výsledek pojmenovat. Výsledný návrh dotazu:
(V odpovědi je 35 zákazníků.)
Dva konstrukční prvky návrhu zajišťují
výsledek:
polospojení mezi tabulkami (o polospojení viz
následující kapitolu),
a kritérium „Is Null“ (omezuje na řádky,
v nichž je hodnota v daném poli prázdná).
54
V SQL databázi, která neumí polospojení, by
bylo místo toho nutno použít kritérium
not in (select…)
Pokud vyzkoušíte tuto verzi v MS Access,
možná zpozorujete mírné zpoždění
v provádění dotazu!
V databázi Řešení jsou další příklady ve skupině „Co se nestalo“, dotazy „Zákazníci bez
objednávky“, „Zákazníci bez objednávky od 1998“, „Výrobky nenakupované největšími
zákazníky“, „Výrobky v dané zemi neprodávané“.
Obtížnější je případ, kdy si musíme uměle sestavit první seznam k tomuto typu úloh, tj. seznam „kde jsou
všichni“. Příklad uvádí dotaz „Výrobky x Země“ ve skupině „Co se nestalo“. Seznam „hodnot k vyškrtnutí“ je
v tomto případě dotaz „Výrobky prodávané v zemích –vše“. Průvodce v tomto případě ani nelze použít, neboť
polospojení musí být definováno pro dvojice polí (ČísloVýrobku; ZeměPříjemce) (o tom jak to udělat viz další
kapitolu). Výsledný dotaz „Výrobky v zemích neprodávané“ nalézá v jednotlivých zemích ty výrobky, které se
tam neprodávaly.
9.1 Alternativní řešení
Pro většinu takovýchto úloh existují alternativní řešení! Pro náš příklad existuje snadné řešení:
Ale pozor, dva zákazníci,
ti co nemají vůbec žádnou objednávku,
nám ve výsledku chybí!
Jinou možnost poskytuje využití křížových dotazů. Pro náš příklad:
– takto dostáváme přehled nákupů zákazníků v jednotlivých měsících, a prázdné políčko ve
výsledku značí, že zákazník v tom měsíci nenakupoval… I zde chybí oba zákazníci bez objednávky.
Prohlédněte si dotazy v databázi Řešení ve skupině „Co se nestalo“: „Prodeje výrobků v zemích“
(posuďte i následující dotaz „Výrobky neprodávané v USA“) a „Nákupy zákazníků podle ceny
výrobků“ (tento dotaz používá sofistikovaný výraz pro zaokrouhlení ceny výrobků).
55
10 Polospojení
Běžné spojení mezi tabulkami vytváří do výsledku kombinace řádků z obou tabulek, jež vyhovují
podmínce propojení. To znamená, že ty řádky v jedné či druhé tabulce, které takto nelze
zkombinovat, ve výsledku nejsou. Například propojíme-li tabulky Objednávky a Zákazníci:
– ve výsledku nejsou zákazníci „FISSA Fabrica Inter. Salchichas S.A.“ (KódZákazníka FISSA) a
„Paris spécialités“ (KódZákazníka PARIS), ačkoli v tabulce Zákazníci je nalezneme. To proto, že
v tabulce Objednávky není žádný řádek s KódZákazníka FISSA nebo PARIS, od těchto dvou
zákazníků nemáme žádnou objednávku.
Můžeme dosáhnout toho, že tito dva zákazníci ve výsledku budou také – musíme změnit běžné
propojení na polospojení 48. Poklepejte na čáru spojující obě tabulky, tím vyvoláte dialog
„Vlastnosti spojení“:
V horní části tohoto dialogu je pravidlo propojení. V dolní části je přepínač mezi běžným
spojením 49, levým polospojením a pravým polospojením. Přepněte přepínač do polohy 2, tj. na
„Zahrnout všechny záznamy z tabulky Zákazníci…“, potvrďte OK. Čára spojující obě tabulky má
nyní šipku:
Ve výsledku dotazu najdete nyní i ty dva zákazníky, FISSA a PARIS. Podívejte se, co je ve sloupci
ČísloObjednávky u těchto dvou zákazníků – je tam prázdné políčko 50.
48
Někdy též nazývané vnější spojení (OUTER JOIN).
49
Někdy též nazývaným vnitřní spojení (INNER JOIN).
50
Prázdná hodnota, tzv. Null .
56
Ve výsledku polospojení v řádcích, které vznikly polospojením navíc (tj. nejsou kombinací řádků
z obou tabulek), jsou ve sloupcích, kde nic nemůže být, prázdná políčka.
V dotazech s polospojením lze též počítat souhrny. Zkuste nejprve agregační funkci count:
V řádcích zákazníků FISSA a PARIS vidíme ve sloupci PočetObjednávek číslo 0.
Pozor, zde nesmíme použít výraz count(*), ten počítá počet řádků v dotazu před seskupením, a ten
je i pro zákazníky FISSA a PARIS nenulový, protože jeden řádek tam pro ně byl! Zkuste (ve
čtvrtém sloupci je u FISSA a PARIS číslo 1):
Vyzkoušíme i agregační funkci sum. Nejprve jednodušeji, spočítáme každému zákazníkovi součet
dopravného:
Zákazníci FISSA a PARIS mají součet prázdný! 51
Pro počítání tržeb všech zákazníků by bylo nutno připojit dotaz Mezisoučty objednávek, a
takovouto kombinaci spojení a polospojení nelze v MS Access udělat, je třeba určit, co se má dělat
dříve, zda běžné spojení a pak polospojení, nebo obráceně. Takže nejprve připravíme
51
Součet prázdné množiny hodnot není 0. Stejně je tomu s ostatními agregačními funkcemi, kromě funkce Count.
57
a pak tento výsledek polospojíme s tabulkou Zákazníci:
V databázi Řešení jsou příklady dotazů s polospojením ve skupině „Jiné propojení“. Dotaz
„Zákazníci a dodavatelé výrobků podle měst“ propojuje ke smluvním partnerům dodávané výrobky.
Dotaz „Porovnání tržeb za výrobky“ spojuje dva předchozí mezivýsledky polospojením
(povšimněte si výrobku „Laughing Lumberjack Lager“).
V kapitole 8 Mezivýsledky v podkapitole 8.2 Mezivýsledek pro použití v kritériu je řešen příklad
pomocí série mezivýsledků, a na konci je poznámka, že pomocí polospojení můžeme výsledek ještě
vylepšit. Ukažme tedy jak. Konečný výsledek ze zmíněné subkapitoly upravíme:
a polospojíme ho s dotazem „zákazníciNejhoršíchVýrobků“ (obrázek nahoře na následující straně).
Následující tabulka ukazuje výsledek (poslední pole má titulek).
Ve skupině „Tendence nákupů“ v dotaze „Počet objednávek výrobků“ je použit lépe vyhovující výraz pro
takovýto účel.
58
Zákazník
QUICK-Stop
Ernst Handel
Save-a-lot Markets
Rattlesnake Canyon Grocery
Tržba
2 756 932,62 Kč
2 621 874,45 Kč
2 609 048,74 Kč
1 277 445,02 Kč
podíl nakupuje také nejhorší výrobky?
8,71% QUICK-Stop
8,29% Ernst Handel
8,25% Save-a-lot Markets
4,04%
Hungry Owl All-Night Grocers 1 249 497,63 Kč 3,95%
Hanari Carnes
821 034,25 Kč 2,59%
Königlich Essen
Folk och fä HB
772 709,59 Kč 2,44% Königlich Essen
739 189,05 Kč 2,34%
Mere Paillarde
White Clover Markets
Frankenversand
Queen Cozinha
Berglunds snabbköp
721 804,74 Kč
684 090,12 Kč
666 413,97 Kč
642 937,44 Kč
623 189,43 Kč
…
…
2,28% Mere Paillarde
2,16% White Clover Markets
2,11% Frankenversand
2,03% Queen Cozinha
1,97%
……
V případě, že chceme polospojit vztahy nezávislých objektů, potřebujeme vytvořit polospojení přes více polí,
jako v dotazu „Výrobky v zemích neprodávané“ ve skupině „Co se nestalo“. V návrhovém zobrazení je pak
třeba nastavit přepínač v dialogu „Vlastnosti spojení“ u obou čar znázorňujících propojení.
59
11 Self join
Při řešení některých úloh zjistíme, že potřebujeme do dotazu dát nějakou tabulku dvakrát, a propojit
ji nějakým způsobem samu se sebou. Například můžeme chtít zjistit, zda u některého výrobku
někdy došlo ke zlevnění. Záznamy o cenách výrobků máme v tabulce Rozpis objednávek, pro
jednoduchost budeme předpokládat, že čísla objednávek ukazují, která objednávka byla dřív, a která
později. Hledáme tedy dvě objednávky, jednu s nižším číslem a druhou s vyšším číslem, v nichž byl
objednán tentýž výrobek, poprvé s vyšší cenou než podruhé. Protože číslo objednávky je v tabulce
Rozpis objednávek také, tabulku Objednávky k ničemu nepotřebujeme.
Po programu tedy chceme, aby hledal dvojice řádků z tabulky Rozpis objednávek, ve kterých je
stejné ČísloVýrobku, přičemž ČísloObjednávky v prvním řádku je nižší než ve druhém řádku a
JednotkováCena v prvním řádku je vyšší než ve druhém řádku.
Obecně, hledáme dvojice řádků ze stejné tabulky splňující nějakou podmínku. V takovém případě
musíme do návrhu dotazu dát tuto tabulku dvakrát:
Druhý exemplář stejné tabulky v návrhu dotazu MS Access přejmenuje – přidá „_“ a číslo 1 52.
Pokud některá z podmínek, jež mají být mezi hledanými řádky splněny, je rovnost mezi poli řádků
těchto tabulek, jako v našem případě rovnost polí ČísloVýrobku, můžeme ji v návrhu vytvořit jako
propojení:
pozor na přejmenování druhé tabulky
Ostatní podmínky je třeba zadat jako kritéria:
V odpovědi vidíme jistou redundanci informace, objednávka č. 10308 je zde opakovaně.
V databázi Řešení ve skupině „Jiné propojení“ je dotaz „Zlevnění výrobku“, ve kterém není použit
náš zjednodušující předpoklad o stoupajících číslech objednávek v průběhu času. V jeho návrhu
uvidíte, že i tabulka Objednávky je tam dvakrát, oba exempláře jsou připojeny ke „svému“
exempláři tabulky Rozpis objednávek.
Mnoho úloh podobného typu lze ovšem řešit i jednodušeji, a to pokud všechny podmínky na dvojice
hledaných řádků jsou rovnosti stejných polí. Například dotaz „Objednávky téhož zákazníka
v jednom dni“ ve skupině „Jiné propojení“ má jednodušší řešení: seskupení tabulky Objednávek
podle KódZákazníka a DatumObjednávky a kritériem count(*)>1. Pokud chceme ještě informaci,
které objednávky to byly, můžeme do odpovědi vnořit datový list tabulky Objednávky:
52
Další by měly číslo 2, 3, … (V SQL-kódu jde o aliasy tabulek.)
60
(O vnořených datových listech viz kapitolu
7 Přehledy a souhrny ještě jinak.)
Dotaz „Zaměstnanci pohled“ ve skupině „Jiné propojení“ ukazuje propojení tabulky Zaměstnanci
samé se sebou, a to propojením polí Nadřízený a ČísloZaměstnance. Exemplář tabulky
Zaměstnanci, ze kterého propojujeme pole Nadřízený, je přejmenován 53 na „Podřízení“ kvůli
přehlednosti. Hodnota tohoto dotazu je zvýšena vnořením datového listu tohoto dotazu do sebe!:
Zbavit se v tomto pohledu zaměstnanců nižší úrovně je obtížné, jak ukazuje následující dotaz „Pro organizační
schéma“. To proto, že relační databáze jsou pro prozkoumávání hierarchií dosti nešikovné (srovnej Dotaz
„Šéfové druhé úrovně“). Obdržet skutečně hierarchický pohled (sestava Organizační schéma) dá mnoho práce.
53
Takové přejmenování je třeba udělat úpravou aliasu v SQL-kódu. Jde čistě o pohodlí, MS Access generuje dostatečně
korektní strojové aliasy. Jiný způsob „přejmenování“ by byl dotaz jiného jména zobrazující pole tabulky.
61
12 Sestavy
Sestava je jakousi šablonou, podle níž se má upravit pro tisk tabulka či výsledek dotazu. Ukázky
sestav si můžete prohlédnout ve vzorové databázi Northwind a v databázi Řešení.
Nejjednodušší cestou k vytvoření sestavy je volba „automatická sestava“, sestavy takto vytvořené
jsou však velmi jednoduché. Náročnější sestavy lze nejlépe vytvořit pomocí průvodce, jenž za vás
udělá mnoho rutinní práce, a vzniklý návrh sestavy můžete eventuelně následně upravit. Také je
možno vytvořit celou sestavu rovnou v návrhovém zobrazení, to je však zbytečně pracné.
12.1 Automatické sestavy
MS Access nabízí dva druhy automatických sestav – sloupcové a tabelární. Vyzkoušejte
automatickou sloupcovou sestavu pro tabulku Kategorie, a automatickou tabelární sestavu pro dotaz
„Souhrny podle zemí v jednotlivých letech“ 54:
Protože sestava je vždy šita na míru nějaké tabulce nebo dotazu, můžete tuto tabulku nebo dotaz
nejprve vyznačit v seznamu v okně databáze, a pak požádat o novou sestavu nad nimi 55. Nebo
můžete požádat o novou sestavu 56, a hned v prvním následném kroku vybrat zdroj záznamů ze
seznamu tabulek a dotazů v databázi.
Sestava vytvořená pro tabulku Kategorie obsahuje i obrázky z pole Obrázek. Sloupcová sestava má
pole z jednoho záznamu pod sebou, jednotlivé záznamy následují po sobě. Tabelární sestava má
pole z jednoho záznamu vedle sebe – tabulka je vytištěna jako tabulka.
Výsledky pokusů z této sekce nemusíte ukládat.
12.2 Průvodce sestavou
Pokud použijete průvodce sestavou, a to lze doporučit v každém případě, nemusíte dokonce ani mít
vytvořen dotaz, na jehož základě má být sestava navržena, pokud se jedná o jednoduchý dotaz – na
začátku průvodce sestavou se zobrazí dialog známý z průvodce jednoduchým dotazem, v němž lze
vybrat pole z více tabulek či dotazů. Průvodce sám sestaví příslušný jednoduchý dotaz jako zdroj
záznamů budoucí sestavy.
Vyzkoušejte to na příkladě, vyberte:
z tabulky Zákazníci - KódZákazníka, Firma, Země
54
Tento dotaz si importujte z databáze Řešení.
55
V panelu nástrojů tlačítko Nový objekt
56
V okně Databáze přepnout na objekty Sestavy, a tlačítkem Nový
, pak vybrat volbu Sestava.
62
požádat o novou sestavu.
z tabulky Objednávky - ČísloObjednávky, DatumObjednávky, DatumOdeslání, Přeprava, Dopravné
z tabulky Výrobky - ČísloVýrobku, NázevVýrobku
z dotazu Rozšířené podrobnosti objednávek - JednotkováCena, Množství, Sleva, VýslednáCena.
Pořadí polí ve výběru ovlivní pořadí v budoucí sestavě!
V dalším kroku, eventuelně, navrhne průvodce sestavou možné hierarchické členění sestavy na
základě relací v databázi. Tento krok „Jak chcete prohlížet data?“ se vůbec neobjeví, pokud
průvodce žádné možnosti hierarchického členění nenajde. Pokud chcete tuto službu co nejlépe
využít, sestavte svůj dotaz tak, aby v něm byly relace z návrhu relací v databázi použity, pokud to
dává smysl pro daný účel 57.
Přepínačem vlevo lze vybírat některé další možnosti uspořádání. Odstranit pouze některé
z nabízených úrovní však nelze (nelze například prohlížet podle zákazníků a vynechat hierarchickou
úroveň objednávek). V našem příkladu ponechte původní nastavení „podle Zákazníci“:
návrh hierarchického
členění sestavy
V dalším kroku „Chcete přidat úrovně seskupení?“ můžete návrh hierarchického členění sestavy
upravit přidáním dalších úrovní (celkem mohou být maximálně 4). V našem příkladu vyberte pole
Země ze seznamu vlevo:
V dalším kroku nastavujete dvě věci: řazení v nejnižší úrovni hierarchie a souhrny. Řazení nastavte
podle NázevVýrobku
Pomocí tlačítka
zavolejte dialog, ve kterém zadáte požadavky na výpočet
souhrnů v sestavě. Zadejte „Součet“ u „VýslednáCena“. Povšimněte si možnosti „Jen souhrnně“ –
jejím vybráním bychom v sestavě neměli detaily o jednotlivých výrobkách – ponechte „Podrobně a
57
Kódy entit vybírejte raději z tabulek těchto entit, pokud chcete podle těchto entit mít úroveň hierarchie. Když
propojujete mezivýsledky, pak co lze propojit z tabulek schématu až v posledním kroku, to tak udělejte.
63
souhrnně“!. Dále si povšimněte možnosti výpočtu procent z celku – ani toto v našem příkladu
nevyužijeme. Tedy pouze zaškrtneme:
Potvrzením OK se vrátíme do předchozího dialogu, přejdeme na další krok. V tomto kroku vybíráte
celkové rozložení na stránce, pro náš příklad vyberte Hierarchické1. I zde si prohlédněte zbytek
dialogu.
V dalším kroku vybíráte jeden z automatických formátů sestavy, do určité míry lze tento seznam
v siné situaci doplnit. Pro náš příklad vyberte „Světle šedý“. Naposled vybraný automatický formát
v průvodci sestavou se používá v automatických sestavách!
V posledním kroku sestavu pojmenujte, například Cvičná sestava. Po dokončení průvodce chvíli
probíhá generování sestavy, nakonec vidíte náhled
hlavičky úrovní hierarchie,
kromě nejnižší úrovně
v nejnižší úrovni řazeno podle
NázevVýrobku
vypočtený souhrn pro
objednávku
vygenerované popisné texty pro
souhrn
grafické prvky a formáty textů
odpovídají vybranému
automatickému formátu
zápatí stránky
Listováním pomocí
naleznete na stránce 2 nenápadný souhrn pro
prvního zákazníka, na stránce 5 naleznete stejně nenápadný souhrn pro první zemi.
64
Úpravy se dělají v návrhovém zobrazení, přepněte na něj:
volič celé
sestavy
místo pro tažení
myší pro změnu
šířky sestavy
voliče sekcí
sestavy
sekce Záhlaví
KódZákazníka
obdélník
pole se seznamem
čára
popisek
textové pole
dolní okraj
sekce – místo
pro tažení
myší pro
změnu
velikosti sekce
Ukážeme si základní úpravy, o dalším viz nápovědu programu MS Access.
V návrhu sestavy jsou grafické objekty: popisky, textová pole či pole se seznamem, čáry a
obdélníky. Každý grafický objekt, každá sekce i celá sestava mají vlastnosti nastavitelné v okně
Vlastnosti 58, některé vlastnosti lze ovlivnit volbou v panelu nástrojů, velikosti a polohu lze
ovlivňovat tažením myší. Okno Vlastnosti ve svém titulku sděluje, jaký typ objektu jste vyznačili.
Ke grafické úpravě návrhu sestavy lze použít standardní postupy známé z MS Office. Navíc je zde
menu Formát. Přesun objektů v rámci sekce je možný tažením myši uchopením za větší čtvereček
vlevo nahoře v okraji vyznačeného objektu, nebo pokud ukazatel myši vypadá jako otevřená dlaň.
Přesun či kopírování do jiné sekce je možný pouze přes schránku MS Windows – před vložením
ukážeme na oddělovač cílové sekce. Přesouvání v rámci sekce je též možné pomocí kláves
Ctrl+šipky. Změna velikosti objektu pomocí Shift+šipky. Popiskem k textovému poli je možno
pohybovat samostatně pouze uchopením za větší čtvereček vlevo nahoře v okraji objektu.
Text popisků lze změnit přímo umístěním kurzoru do textu v objektu popisku a následným
editováním.
58
Menu Zobrazit-Vlastnosti či tlačítko Vlastnosti
v panelu nástrojů.
65
Nepotřebné objekty lze též vyznačit a smazat klávesou Delete. (Smažte popisné texty v sekcích
zápatí kromě polí „=sum(VýslednáCena)“.)
Textová pole v návrhu sestavy jsou dvojí: ty, co zobrazují obsah polí zdroje záznamů sestavy, a
výrazy. Výrazy začínají „=“. Co textové pole zobrazí v tisku je vyjádřeno ve vlastnosti „Zdroj
ovládacího prvku“:
u políčka vlastnosti představuje možnost zavolat tvůrce pro tvorbu hodnoty této
Tlačítko
vlastnosti. – Souhrny jsou počítány pomocí agregační funkcí, jejich argumenty mohou být pouze
výrazy z polí zdroje záznamů.
Souhrny lze přemístit ze zápatí do záhlaví stejné úrovně hierarchie: přemístěte souhrny pro Země a
KódZákazníka ze zápatí do záhlaví!
Vlastnost Název na kartě Jiné obsahuje jméno objektu. Pokud chceme vytvořit výraz z hodnot
textových polí či polí se seznamem, která již jsou v návrhu sestavy, odkazujeme se na ně jejich
názvy. Zkuste vytvořit nové pole pro součet celkové částky za výrobky v objednávce a dopravného:
V panelu nástrojů „Souprava nástrojů“ vyberte Textové pole
, vyznačte v sestavě místo v zápatí
ČísloObjednávky, kde nové pole chcete. Do návrhu sestavy se přidala dvojice popisek – textové
pole s výrazem „nevázaný“. Místo stávajícího textu popisku „Text54:“ napište „Celkem“, do výrazu
textového pole sestavte (tvůrce výrazů v první nabídce nabízí všechny objekty aktuální sestavy):
= [Sum Of VýslednáCena] + [Dopravné]
Zde [Sum Of VýslednáCena] je jméno objektu textového pole se souhrnem pro ČísloObjednávky
(přesvědčte se o tom!).
Nové textové pole by mělo mít správný formát čísla – ten je na kartě Formát v okně Vlastnosti jako
první volba. Do našeho nového pole můžete zkopírovat masku formátu pole Sum Of VýslednáCena,
již vytvořit průvodce sestavou. Jinou možností pro náš příklad je volba „měna“.
Pro náš příklad přemístěte pole Dopravné i s jeho popiskem ze záhlaví do zápatí ČísloObjednávky,
upravte celkový vzhled a formáty objektů jako na obrázku na následující straně. Vždy máte
kontrolu v zobrazení náhledu sestavy.
V náhledu si prohlédněte, jak se zalamují stránky. Nepříjemné je, že nový zákazník může začínat na
stránce dole, dále je nepříjemné, že někdy dochází k lámání stránky uprostřed objednávky. Oba
nedostatky napravíme.
V návrhovém zobrazení klepněte na sekci zápatí KódZákazníka, v jejích vlastnostech na kartě
Formát jako první je „Ostránkovat“. Vyberte „za sekcí“. Nyní bude za každým zákazníkem
ostránkováno. Pokud chcete opakovat záhlaví zákazníků na každé nové stránce, zvolte vlastnost
sekce záhlaví na kartě Formátové „Opakovat sekci ano“.
Dále si zjistíme, jak je to se samotnou existencí sekcí sestavy. Zobrazíme Řazení a seskupování 59.
Zobrazí se dialog Řazení a seskupování, kde jsou úrovně hierarchie vytvořené průvodcem – zde je
možno vše změnit, přidat… vyberte pole ČísloObjednávky, ve spodní části dialogu „Vlastnosti
59
Menu Zobrazit – Řazení a seskupování, nebo v panelu nástrojů stejné tlačítko
66
.
skupiny“ nastavte „Udržovat pohromadě celou skupinu“. Potvrďte, nyní budou celé objednávky na
jedné straně, pokud se na jednu stránku vejdou (objednávka 11077 na str. přibližně 254 se na
stránku vejde dosti těsně).
Další možnosti ovlivnění vzhledu sestavy vycházejí z volby v menu Soubor-Vzhled stránky.
(Sestava „Prodeje zaměstnanců v posledním čtvrtletí“ v databázi Řešení má více sloupců,
formátová vlastnost „Nový řádek nebo sloupec“ sekce Zápatí ČísloZaměstnance zajišťuje
zalamování sloupců.)
V databázi Řešení jsou ukázky sestav vytvořených pomocí průvodce sestavou „Prodeje
zaměstnanců v posledním čtvrtletí“ a „Přehled nákupů zákazníků“, vytvořené podle
stejnojmenných dotazů.
Chcete-li zjistit, co je zdrojem záznamů nějaké sestavy, podívejte se v návrhovém zobrazení na
datovou vlastnost „Zdroj záznamů“ celé sestavy. (Kde je volič celé sestavy viz obrázek na str.65.)
Další sub-kapitoly v této kapitole objasňují některé náročnější možnosti při vytváření sestav.
12.3 Podsestavy
Sestava „Města se zákazníky a zaměstnanci“ v databázi Řešení má tzv. podsestavy – detaily
vnořené v hlavní sestavě. Tyto detaily mají vlastní návrh, v případě zmíněné sestavy jde o sestavy
„Adresy zákazníků“ a „Adresy zaměstnanců“. Všimněte si, že tyto dvě sestavy zobrazují všechny
zákazníky resp. zaměstnance, kdežto v sestavě „Města se zákazníky a zaměstnanci“ se pod
příslušným městem zobrazují pouze zákazníci a zaměstnanci z tohoto města. Dále si všimněte, že
v sestavách „Adresy zákazníků“ a „Adresy zaměstnanců“ nejsou textová pole s městem, tyto
sestavy město nezobrazují. Ale je podstatné a nutné, že pole „město“ je ve zdroji záznamů obou
sestav „Adresy zákazníků“ a „Adresy zaměstnanců“.
Záležitost s podsestavami je podobná jako s vnořenými datovými listy. Podsestavu vytvoříme
volbou v panelu nástrojů „Souprava nástrojů“ tlačítkem Podformulář či podsestava
, když
následně v sestavě vymezíme místo, kam chceme podsestavu umístit. Pak se spustí průvodce, který
67
se vás na vše zeptá, včetně výběru řídících a dceřiných polí 60. Sestavu, kterou chceme vnořit jako
podsestavu do naší sestavy, musíme mít ale nejprve vytvořenou. Pro její návrh je dobré se snažit o
co nejkompaktnější podobu sestavy. Pokud chcete použít nadpisy z návrhu podsestavy do hlavní
sestavy, vložte je do záhlaví sestavy. (Viz v databázi Řešení sestavu „Katalog-podsestava“, která je
vložena jako podsestava do sestavy „Katalog“.)
Šířka objektu podsestavy v hlavní sestavě se automaticky upraví podle skutečné šířky návrhu
podsestavy. Výšku nedělejte příliš velikou, při tisku se místo zvětší podle aktuální potřeby.
Poněkud specificky je řešena vazba podsestavy „Nejlepší zákazníci zaměstnanců“ a sestavy „Top 10
zaměstnanců“. O tom viz sub-kapitolu 12.4 Parametry.
12.3.1 Grafy
Data detailů vnořených v hlavní sestavě mohou být zobrazena i v grafu. Sestava „Prodeje podle
kategorií“ ze vzorové databáze Northwind zobrazuje detailní data o prodejích výrobků jak
v podsestavě, tak v grafu.
Princip je podobný jako s podsestavami, musíte mít nejprve připraven zdroj záznamů pro graf,
v němž bude „navíc“ pole sloužící k propojení do hlavní sestavy.
Vložení grafu do sestavy provedete volbou z menu Vložit-Graf, a pak je postup podobný jako
s podsestavou. Průvodce se vás na vše vyptá: vyberete pole, jež mají být do grafu zobrazena, typ
grafu, navrhnete rozvržení dat v grafu (poklepáním na políčko u číselné osy dostanete nabídku
způsobů sumarizace, je zde i volba „žádný“), vyberete pole k propojení zdroje řádků hlavní sestavy
se zdrojem řádků grafu, nakonec vyberete nadpis grafu.
Na rozdíl od podsestav, velikost grafu v tisku se nepřizpůsobuje skutečným datům datového zdroje
grafu, je tedy třeba v návrhu sestavy velikost grafu upravit tak, aby stačila pro všechny tištěné
grafy. Úpravy grafu děláte po poklepání na objekt grafu v návrhu sestavy, čímž se zavolá aplikace
MS Graph. Postupy známými z tohoto modulu MS Office lze graf upravovat.
Program MS Access 2002 se při práci s grafy občas dopouští chyb, v takovém případě většinu pomůže zkusit
stejnou akci znova.
V databázi Řešení je sestava „Průběh cen“, která zobrazuje grafy časového průběhu cen
jednotlivých výrobků. Zdrojem záznamů grafu je dotaz „Průběh cen“, v němž jsou časově řazené
ceny výrobků zjištěné z tabulky Rozpis objednávek. Zajímavostí grafů v této sestavě je, že časová
osa všech jednotlivých tištěných grafů je stejná.
12.4 Parametry
Zdroj záznamů sestavy může být parametrický dotaz (o parametrech v dotazu viz str.26). Při
náhledu tisku či při tisku samotném jsme pak vyzváni k zadání hodnoty parametru.
Hodnota parametru může být i vytištěna – návrh sestavy může v záhlaví sestavy obsahovat textové
pole s výrazem odkazujícím se na parametry zdrojového dotazu.
Sestava „Přehled objednávek 2“ je parametrickou verzí sestavy „Přehled objednávek“ (v prvním
parametru Zákazník je očekáván začátek kódu zákazníka, druhé dva parametry nemusíte zadat –
pak jsou limity počátek 20.století a aktuální datum).
Pokud chceme hodnotu parametru předat do podsestavy, je situace náročnější. O tom je výklad
v následující sekci.
60
V poněkud nesrozumitelném kroku průvodce, ve kterém se nabízí seznam propojení hlavní sestavy s podsestavou,
zvolte „Definovat vlastní“.
68
12.4.1 Parametry v podsestavách
Sestava „Prodeje podle kategorií2“ má parametr Rok:, a ten dokonce není ani parametrem jejího
zdroje záznamů (jejím zdrojem záznamů je tabulka Kategorie) 61. Tento parametr je předáván
podsestavě a grafu způsobem vysvětleným dále.
Tisk podsestav probíhá tak, že je vždy znova vyhodnocován dotaz, který je zdrojem záznamů
podsestavy; pak je zformátován a zobrazen výsledek podsestavy s konkrétními daty vyhodnoceného
dotazu. Hodnota je však známa pouze při tisku záhlaví hlavní sestavy, později není proměnná
s touto hodnotou známa.
Do dalších sekcí je hodnotu parametru hlavní sestavy možno předávat tak, že v záhlaví hlavní
sestavy umístíme textové pole se „zdrojem ovládacího prvku“ odkazujícím na parametr (viz sestavu
„Prodeje podle kategorií2“). Vlastnost „Název“ tohoto textového pole cíleně nastavíme na jméno,
odkazované v dalších sekcích hlavní sestavy (zdrojový dotaz podsestavy „Prodeje podle kategorií podsestava2“ má parametr Rok, je tedy mírně odlišný od parametru hlavní sestavy). Parametr je
tedy předáván prostřednictvím jména objektu ze záhlaví sestavy.
Sestava „Prodeje podle kategorií 3“ má jiný zdroj záznamů než sestava „Prodeje podle kategorií2“,
tímto zdrojem záznamů je parametrický dotaz „Tržby v kategoriích“. – Tato sestava bylo upravena
ze sestavy „Prodeje podle kategorií2“ následujícím způsobem: změnil se zdroj záznamů, změněn
byl zdroj objektu „SumOfProdejeVýrobků“ v záhlaví NázevKategorie, a přidáno bylo textové pole
pro souhrn „=Max([SumOfVýslednáCena])“ v záhlaví sestavy 62.
Sestava „Top 10 zaměstnanců“ má ještě sofistikovanější využití parametrů. Její podsestava
„Největší zákazníci zaměstnanců“ má parametr cislozam ve zdrojovém dotazu. V těle hlavní
sestavy je textové pole pro ČísloZaměstnace, jež má vlastnost Název rovnu cislozam (toto textové
pole má navíc formátovou vlastnost Zobrazit rovnu „ne“, není tedy tištěno). Mezi podsestavou a
hlavní sestavou v tomto případě není propojení pomocí řídících a dceřinných polí!
12.5 Obrázky v sestavě
Jak jste viděli v sestavě pro tabulku Kategorií, obrázky z pole typu „objekt OLE“ se bez problému
dostanou do návrhu sestavy. Pokud je však v poli tabulky pouze text se jménem souboru, jako je
tomu v tabulce Zaměstnanci, je situace složitější. Obrázky v takovém případě lze do sestavy umístit
pouze programátorsky. Příklad naleznete v sestavě „Top 10 zaměstnanců“.
V takovýchto případech je nutno do návrhu sestavy umístit eventuelně nezobrazované textové pole se jménem
souboru s obrázkem (pole Foto z tabulky Zaměstnanci), a dále jakýkoli obrázek (v panelu nástrojů „Souprava
nástrojů“ tlačítko Obrázek, vymezíme místo v návrhu sestavy, v dialogu pro nalezení souboru vybereme
jakýkoli existující obrázek). Ve formátové vlastnosti „Obrázek“ nového objektu obrázku následně vymažeme
hodnotu, tj. jméno souboru s cestou. Objekt obrázek v sestavě je nyní nevázaný. Dále změňte formátovou
vlastnost „Typ obrázku“ na „propojený“.
Skutečné hodnoty vlastnosti „Obrázek“ musí být dosazovány až při tisku, což lze zajistit událostní vlastností
sekce sestavy. V sestavě „Top 10 zaměstnanců“ v událostní vlastnosti „Při tisku“ sekce Tělo najdete proceduru,
která aktualizaci obrázku zajistí, příslušný příkaz je:
Me![Obrázek20].Picture = "C:/Program Files/Microsoft Office/Office10/Samples/" & Me![Foto]
jméno objektu s obrázkem
v návrhu sestavy
cesta ke všem obrázkům
název textového pole
v sestavě
obsahujícího jméno souboru
obrázku
61
Jako parametr je vyhodnoceno vše, co není jménem pole zdroje záznamů či známým jménem proměnné.
62
Účel této sestavy je zobrazit maximum součtů, což nelze jinak, než nejprve spočítat součty, a pak z nich maximum.
69
13 Akční dotazy
V kapitole Seskupovací dotazy v sekci Agregace First, Last jsou vyloženy specifické důvody pro
použití vytvářecího dotazu k uložení mezivýsledku jako tabulky do databáze. Ve snaze získávat
informace z databází mohou existovat i jiné důvody k tomu, abychom vytvářeli nové tabulky či
v již existujících tabulkách měnili data.
13.1 Vytvářecí dotazy
Vytvářecí dotazy slouží k tomu, aby výsledek dotazu byl uložen jako tabulka v databázi. Můžeme je
použít například tehdy, když chceme pro své účely upravit a uložit data z nějakého externího zdroje,
k nimž máme přístup nějakým způsobem ztížený.
Z běžného výběrového dotazu uděláme vytvářecí dotaz tím, že ho přepneme na typ „Vytvářecí
dotaz“ 63. Po tomto se hned objeví dialog „Vytvořit tabulku“, v němž zadáme název tabulky, kterou
má dotaz vytvořit.
Návrh dotazu děláme stejně jako u běžných dotazů, přepnutí zobrazení na Zobrazení datového listu
nám ukáže náhled výsledku. Skutečnou akci, tj. vytvoření nové tabulky, spustíme volbou „Spustit“
64
.
Vytvořme si například pomocnou tabulku zemí, využijme pole Země z tabulky Zákazníci:
13.2 Přidávací dotazy
Přidávací dotazy slouží k tomu, aby výsledek dotazu byl připojen do již existující tabulky jako nové
řádky. Postup je stejný jako v předchozím případě, pouze typ dotazu zvolíme „Přidávací dotaz“, a
vybereme tabulku, do níž se má výsledek připojit.
Pokračujme v našem příkladu, a přidejme do tabulky Země další země z pole Země z tabulky
Dodavatelé, které v tabulce Země ještě nejsou (srovnej eventuelně kapitolu 9 Dotazy na to co
v databázi není) – viz obrázek nahoře na další straně.
Přidávací akční dotazy se provedou volbou „Spustit“
náhled nových přidávaných řádků.
, zobrazení datového listu ukazuje pouze
63
Menu Dotaz nebo přepínač Typ dotazu v panelu nástrojů Návrh dotazu.
64
Menu Dotaz nebo tlačítko Spustit
v panelu nástrojů Návrh dotazu.
70
Dokončeme náš příklad tím, že otevřeme návrh tabulky Země a přidáme pole Kontinent typu text
délky 15:
a na kartě Vyhledávání tohoto pole vyjmenujeme možné hodnoty:
Nakonec otevřeme datový list tabulky Země a vybereme správný kontinent pro každou Zemi:
Země
Argentina
Belgie
Brazílie
Dánsko
Finsko
Francie
Irsko
Itálie
Kanada
Mexiko
Německo
Norsko
Polsko
Kontinent
Jižní Amerika
Evropa
Jižní Amerika
Evropa
Evropa
Evropa
Evropa
Evropa
Severní Amerika
Severní Amerika
Evropa
Evropa
Evropa
Země
Kontinent
Portugalsko Evropa
Rakousko
Evropa
Španělsko
Evropa
Švédsko
Evropa
Švýcarsko
Evropa
USA
Severní Amerika
Velká Británie Evropa
Venezuela
Jižní Amerika
Austrálie
Austrálie
Japonsko
Asie
Nizozemí
Evropa
Singapur
Asie
71
Tabulku Země můžeme použít pro počítání souhrnů obchodu v jednotlivých kontinentech…
Můžeme ji v budoucnu příležitostně aktualizovat přidávacím dotazem podobným našemu příkladu,
když přibudou nové země ve zdrojové databázi.
Můžete chtít tabulku Země uspořádat abecedně podle zemí. Pokud to uděláte v datovém listu, změní se pouze
váš pohled na data. Můžete také podle polí Země a Kontinent indexovat – v návrhu tabulky zadat u těchto polí
„indexovat“.
Pokud chcete vytvořit uspořádanou kopii tabulky, nejprve v okně Databáze tuto tabulku zkopírujte a v dialogu
při kopírování nastavte „Jen struktura“. Pak přidávacím dotazem se zadaným řazením do nové tabulky přidejte
řádky z tabulky Země…
Všechny tyto možnosti ovlivňují efektivitu databáze, kterážto problematika vysoce přesahuje rámec těchto
skript.
13.3 Odstraňovací dotazy
Odstraňování jednotlivých záznamů je možné v datovém listu tabulky, když tyto záznamy
vyznačíme a klávesou Delete požádáme o jejich odstranění, následující potvrzující dialog
potvrdíme. Toto je nejbezpečnější způsob, neboť mažeme to, co vidíme.
Smazané záznamy již nelze obnovit zpět, data jsou nenávratně ztracena!
Odstraňovat záznamy lze i hromadně, byť je tato záležitost nebezpečná a vyžaduje vysokou
ostražitost. K tomuto účelu slouží odstraňovací dotazy.
Ukažme si to na příkladu odstranění starých dat. Zálohujte si vzorovou databázi Northwind,
odstraňte atribut jen pro čtení. Ve svém projektu vytvořte dotaz typu „Odstraňovací dotaz“:
Spusťte
tento dotaz, potvrďte varující dialog.
Podívejte se následně do tabulky Objednávky: jsou zde záznamy pouze
z roku 1998, záznamy začínají objednávkou č. 10808.
Podívejte se i do tabulky Rozpis objednávek, i zde začínají záznamy
číslem objednávky 10808! To je způsobeno vlastností relace mezi těmito
tabulkami „Odstranění souvisejících polí v kaskádě“, která je ve vašem
projektu je nepřístupná, ale můžete si ji prohlédnout přímo v databázi
Northwind.
Vidíte, že jste z projektu připojeného k databázi odstranili v této databázi data, dokonce více dat,
než jste nejspíše zamýšleli. Po tomto pokusu vraťte databázi Northwind do původního stavu pomocí
záložní kopie.
Ukažme si ještě jeden příklad, výrazně odstrašující. Vytvořte si takovýto „archiv“ (kód je dostupný
též na nb.vse.cz/~palovska/uzida/):
SELECT Výrobky.ČísloDodavatele, Dodavatelé.Firma, Dodavatelé.KontaktníOsoba, Dodavatelé.Funkce,
Dodavatelé.Adresa, Dodavatelé.Město, Dodavatelé.Oblast, Dodavatelé.PSČ, Dodavatelé.Země,
Dodavatelé.Telefon, Dodavatelé.Fax, Dodavatelé.DomovskáStránka, [Rozšířené podrobnosti
objednávek].ČísloVýrobku, Výrobky.NázevVýrobku, Výrobky.ČísloKategorie, Výrobky.MnožstvíVJednotce,
Výrobky.JednotkováCena, Výrobky.JednotkyNaSkladě, Výrobky.ObjednánoJednotek,
Výrobky.MinimálníÚroveň, Výrobky.NákupUkončen, [Rozšířené podrobnosti objednávek].JednotkováCena,
[Rozšířené podrobnosti objednávek].Množství, [Rozšířené podrobnosti objednávek].Sleva, [Rozšířené
podrobnosti objednávek].VýslednáCena, [Rozšířené podrobnosti objednávek].ČísloObjednávky,
Objednávky.ČísloZaměstnance, Objednávky.DatumObjednávky, Objednávky.DodatDne,
Objednávky.DatumOdeslání, Objednávky.Přeprava, Objednávky.Dopravné, Objednávky.JménoPříjemce,
Objednávky.AdresaPříjemce, Objednávky.MěstoPříjemce, Objednávky.[Oblast příjemce],
Objednávky.PSČPříjemce, Objednávky.ZeměPříjemce, Objednávky.KódZákazníka, Zákazníci.Firma,
72
Zákazníci.KontaktníOsoba, Zákazníci.Funkce, Zákazníci.Adresa, Zákazníci.Město, Zákazníci.Oblast,
Zákazníci.PSČ, Zákazníci.Země, Zákazníci.Telefon, Zákazníci.Fax INTO archiv
FROM Zákazníci INNER JOIN (Dodavatelé INNER JOIN (([Rozšířené podrobnosti objednávek] INNER JOIN
Výrobky ON [Rozšířené podrobnosti objednávek].ČísloVýrobku = Výrobky.ČísloVýrobku) INNER JOIN
Objednávky ON [Rozšířené podrobnosti objednávek].ČísloObjednávky = Objednávky.ČísloObjednávky) ON
Dodavatelé.ČísloDodavatele = Výrobky.ČísloDodavatele) ON Zákazníci.KódZákazníka =
Objednávky.KódZákazníka;
Tento archiv obsahuje téměř všechna data z databáze Northwind, pouze data o zaměstnancích a
přepravcích jsme ponechali v samostatných tabulkách.
Odstraníme nyní z „archivu“ stará data:
Podívejte se nyní do archivu, zkusme nalézt výrobky „Genen Shouyu“
nebo „Tofu“! Nejsou tam, všechny informace o nich jsme ztratili! Zkuste
nalézt zákazníky „Centro comercial Moctezuma“, „Familia Arquibaldo“,
„FISSA Fabrica Inter. Salchichas S.A.“, „Folies gourmandes“,
„GROSELLA-Restaurante“, „Hungry Coyote Import Store“, „Lazy K
Kountry Store“, „Mere Paillarde“, „Paris spécialités“, „Vins et alcools
Chevalier“ – ani ty tam nenajdeme! Vidíme, že jsme ztratili více dat, než
jsme asi zamýšleli.
Kdybychom odstranili ještě mladší data, do konce března 1998, ztratili
bychom dokonce data o dodavateli „Zaanse Snoepfabriek“!
Tyto nehody byly zapříčiněny špatným návrhem „archivu“.
Protože je někdy skutečně potřeba stará či mylná data odstranit, bývá toto často řešeno pomocí umělého pole
typu např. ano/ne, které říká, zda je záznam ještě platný, či nikoli (viz např. pole NákupUkončen v tabulce
Výrobky). Jiná možnost řešení je archivovat stará data někam jinam.
13.4 Aktualizační dotazy
Poslední z akčních dotazů jsou aktualizační dotazy. Ty slouží k hromadné úpravě či opravě dat
v nějaké tabulce. I zde je třeba varovat, že neuváženým použitím takového nástroje můžete
nenávratně ztratit data.
Ukažme si komplexní příklad, ve kterém použijeme některé postupy dříve vyložené, i aktualizační
dotaz. Představte si, že jste z externího zdroje získali data v textovém formátu (uložte si někam
soubor nb.vse.cz/~palovska/uzida/exdata.txt). Podívejte se, že jednotlivá pole jsou v našem případě
oddělena tabelátory, záznamy jsou ukončeny znaky konce řádků.
Z těchto dat si chcete vytvořit tabulku databáze MS Access. Nejprve do projektu MS Access tato
externí data propojíme – v menu zvolte Soubor-Načíst externí data-Propojit tabulky, v dialogu
„Propojit“ nastavte „Soubory typu“ na „textové soubory“ a nalezněte soubor s daty. Spustí se
průvodce propojením textu, který vám vždy ukazuje náhled dat po vaší volbě.
V prvním kroku nastavte formát „s oddělovači“, v dalším kroku vyberte oddělovač „Tabelátor“
(data v našem příkladu neobsahují názvy polí, texty nejsou ničím ohraničeny), v dalším kroku
pojmenujte jednotlivá pole (vždy vyberte pole v náhledu dole a v políčku Název pole vepište jméno
pole) : Příjmení, Jméno, DatumNarození, Adresa, Město, Oblast, PSČ, Země, Telefon. V posledním
kroku pojmenujte propojenou tabulku např. Exdata. Jste upozorněni, že propojení proběhlo úspěšně.
Na propojenou tabulku se nyní podívejte.
Podívejte se i na návrh této tabulky – všechna textová pole mají délku 255 znaků. Takový návrh
nemusí vyhovovat, navíc můžeme chtít přidat ještě jiná pole, například Mobil, TelefonDoPráce,
Poznámka. Nechte návrh tabulky Exdata otevřený, a v okně Databáze zvolte „Vytvořit tabulku
v návrhovém zobrazení“.
73
V okně návrhu tabulky Exdata vyznačte všechna pole (například volbou v menu Úpravy-Vybrat
vše) a zkopírujte do schránky (Ctrl+C), přejděte do okna návrhu nové tabulky, a vložte ze schránky
(Ctrl+V). Opravte návrh polí takto (všimněte si změny jmen na česká):
Příjmení, text , délka 20
Jméno, text, délka 10
DatumNarození, datum a čas, formát datum (krátké)
Adresa, text, délka 60
Město, text, délka 15, indexovat ano (duplicita povolena)
Oblast, text, délka 15
PSČ, text, délka 10
Země, text, délka 15, indexovat ano (duplicita povolena)
TelefonDomů, text, délka 24
Přidejte další pole:
Mobil, text, délka 24
TelefonDoPráce, text, délka 24
Poznámka, memo
Uložte novou tabulku pod jménem Osoby, dialog, který vás upozorní na chybějící primární klíč,
potvrďte Ano – do návrhu vaší tabulky je nyní přidáno pole ID. Zavřete okna návrhu tabulek Osoby
i Exdata.
Do nové tabulky Osoby přidáme data z externího zdroje přidávacím dotazem (všimněte si
přejmenování polí):
Podívejte se pak do tabulky Osoby. V polích, která v přidávacím dotazu nebyla, jsou prázdná místa,
pouze primární klíč ID se automaticky vyplnil.
Pokud příště dostaneme další externí data ve stejném formátu, stačí je uložit na stejné místo pod
stejným jménem jako původní soubor. Propojená tabulka Exdata ve vašem projektu bude ukazovat
nová data. Můžete tato nová data připojit do tabulky Osoby, ale nebudeme chtít mít duplicitní
záznamy. Usoudíme například, že pokud je stejné Příjmení, Jméno a DatumNarození, jedná se o
stejnou osobu. Upravte přidávací dotaz tak, že bude sloužit pro všechny další případy:
74
Nakonec si všimneme, že telefony máme bez předvolby státu. Opravíme to aktualizačními dotazy:
nová hodnota v tomto poli
v tomto poli se
žádná změna
dělat nebude
kritéria výběru řádků, ve
kterých se má provést změna
(Jako všechny akční dotazy, i aktualizační se provedou volbou „Spustit“
.)
Oprava TelefonDomů do Velké Británie:
Ostatní telefony budou opraveny
analogicky, pro každou zemi zvlášť.
(Bylo by možno vytvořit i jeden
komplexní aktualizační dotaz s velmi
složitými výrazy.)
Ukažme si nakonec ještě jeden příklad užití aktualizačního dotazu, aplikovaného na odstrašující
„archiv“ (viz předchozí sekce 13.3 Odstraňovací dotazy). Představme si, že zákazník „Save-a-lot
Markets“ změnil telefon. Tuto změnu nyní musíme provést v celém archivu. Můžeme použít
aktualizační dotaz:
sem vepíšete nový telefon
Kdybyste v tomto dotazu udělali chybu a spustili ho, data budou nenávratně změněna.
Tento příklad ukazuje, že v nevhodně strukturované databázi jsme pro běžnou aktualizaci údajů
nuceni použít zbytečně náročnou a nebezpečnou akci.
75
14 Cvičení
V této kapitole jsou uvedeny některé úlohy vhodné k procvičování jednotlivých základních technik.
Tématicky zaměřené úlohy integrující znalosti všech technik jsou pak předmětem další kapitoly.
Pro kontrolu je za každým zadáním uvedeno, jaký má být výsledek. Řešení ve formě SQL-kódů
naleznete na konci této kapitoly.
14.1 Jednoduché dotazy
Cvičení 1. Ve kterých zemích se prodávají výrobky dodavatele Zaanse Snoepfabriek?
Země příjemce (12 zemí): Brazílie, Francie, Itálie, Kanada, Mexiko, Německo, Portugalsko,
Rakousko, Španělsko, Švédsko, USA, Velká Británie
Cvičení 2. Kteří zákazníci požadovali v roce 1998 lhůtu dodání 14 dní?
Firma (21firem): Cactus Comidas para llevar, Rancho grande, Comércio Mineiro,
Vaffeljernet, Bon app', Bottom-Dollar Markets, Drachenblut Delikatessen, Frankenversand,
Königlich Essen, QUICK-Stop, Santé Gourmet, Wolski Zajazd, Bólido Comidas
preparadas, Richter Supermarkt, Rattlesnake Canyon Grocery, Save-a-lot Markets, Split
Rail Beer & Ale, Around the Horn, B's Beverages, Eastern Connection, HILARIÓN-Abastos
Cvičení 3. Které výrobky se prodávaly v posledním měsíci (květen 1998)?
NázevVýrobku (40 výrobků): Chai, Chang, Aniseed Syrup, Chef Anton's Cajun Seasoning,
Grandma's Boysenberry Spread, Uncle Bob's Organic Dried Pears, Northwoods Cranberry
Sauce, Ikura, Queso Cabrales, Queso Manchego La Pastora, Konbu, Tofu, Pavlova, Alice
Mutton, Teatime Chocolate Biscuits, Sir Rodney's Marmalade, Tunnbröd, Guaraná
Fantástica, Rössle Sauerkraut, Nord-Ost Matjeshering, Gorgonzola Telino, Mascarpone
Fabioli, Sasquatch Ale, Chartreuse verte, Jack's New England Clam Chowder, Ipoh Coffee,
Spegesild, Valkoinen suklaa, Filo Mix, Perth Pasties, Tourtiere, Pâté chinois, Camembert
Pierrot, Wimmers gute Semmelknödel, Louisiana Hot , Spiced Okra, Scottish Longbreads,
Röd Kaviar, Rhönbräu Klosterbier, Lakkalikööri, Original Frankfurter grüne Soße
14.2 Dotazy se souhrny
Cvičení 4. Spočítejte celkovou tržbu za zboží jednotlivých dodavatelů!
Dodavatel
Aux joyeux ecclésiastiques
Celkem tržba
4 161 984,37 Kč
Bigfoot Breweries
559 780,00 Kč
Cooperativa de Quesos 'Las Cabras'
628 985,75 Kč
Escargots Nouveaux
147 041,87 Kč
Exotic Liquids
408 899,00 Kč
…
…
Cvičení 5. Spočítejte celkovou tržbu za zboží jednotlivých dodavatelů v roce 1998!
Dodavatel
Aux joyeux ecclésiastiques
Celkem tržba
1 947 008,75 Kč
Bigfoot Breweries
232 952,50 Kč
Cooperativa de Quesos 'Las Cabras'
198 988,75 Kč
Escargots Nouveaux
60 685,00 Kč
Exotic Liquids
157 486,25 Kč
…
…
76
14.2.1 Křížové dotazy
Cvičení 6. Spočítejte tržby za zboží jednotlivých dodavatelů v jednotlivých letech!
Dodavatel
1996
Exotic Liquids
1997
1998
75 449,00 Kč 175 963,75 Kč 157 486,25 Kč
New Orleans Cajun Delights
166 613,00 Kč 447 992,24 Kč 164 594,51 Kč
Grandma Kelly's Homestead
129 800,00 Kč 398 657,50 Kč 520 375,00 Kč
Tokyo Traders
74 036,00 Kč 446 787,50 Kč 242 335,00 Kč
Cooperativa de Quesos 'Las Cabras' 48 816,00 Kč 381 181,00 Kč 198 988,75 Kč
…
…
…
…
Cvičení 7. Pro každého zaměstnance spočítejte tržbu v jednotlivých letech!
Zaměstnanec
1996
1997
1998
Davolio, Nancy
894 112,87 Kč 2 328 701,90 Kč 1 579 875,30 Kč
Fuller, Andrew
543 926,50 Kč 1 761 103,50 Kč 1 858 413,87 Kč
Leverling, Janet
455 599,00 Kč 2 700 653,87 Kč 1 914 068,20 Kč
Peacock, Margaret 1 248 627,88 Kč 3 220 244,77 Kč 1 353 398,50 Kč
Buchanan, Steven
458 285,50 Kč
767 911,66 Kč
495 797,37 Kč
Suyama, Michael
416 065,12 Kč 1 078 159,23 Kč
353 603,87 Kč
King, Robert
380 321,50 Kč 1 511 779,87 Kč 1 218 121,99 Kč
Callahan, Laura
556 003,00 Kč 1 400 815,36 Kč 1 214 738,56 Kč
Dodsworth, Anne
247 362,87 Kč
657 759,81 Kč 1 027 578,95 Kč
Cvičení 8. Spočítejte celkové tržby v jednotlivých zemích (ZeměPříjemce) rozdělené podle
kategorií!
Země
příjemce
Celkem
Cukrovinky
Koření
Argentina
202 977,50 53 377,50 Kč
Kč
22 675,00
Kč
Belgie
845 621,37
Kč
61 369,87
Kč
Brazílie
2 673
144,41 Kč
186 989,50
Kč
Maso /
Drůbež
Mléčné
výrobky
Mořské
produkty
Obilné
výrobky
Nápoje
28 587,50 Kč 15 162,50 Kč
Plodiny
44 950,00 9 750,00 Kč
Kč
53 462,50
Kč
216 500,00 30 352,50 Kč 135 717,00
Kč
Kč
285 902,56 279 519,00 189 077,85
Kč
Kč
Kč
392 011,25 322 178,38 Kč 929 836,12
Kč
Kč
80 650,00
Kč
28 475,00
Kč
80 580,00
Kč
153 038,75 121 580,50
Kč
Kč
Dánsko
816 525,56 64 786,50 Kč 108 128,75
Kč
Kč
79 062,50 66 107,50 Kč 96 431,56 Kč 300 642,50 2 493,75 Kč
Kč
Kč
98 872,50
Kč
Finsko
470 251,31 25 626,25 Kč
Kč
46 825,00
Kč
83 519,50
Kč
…
…
…
…
…
138 952,75 31 182,50 Kč
Kč
…
54 560,00
Kč
61 925,00
Kč
27 660,31
Kč
…
…
…
…
Cvičení 9. Pro každého zákazníka spočítejte jeho nákupy v jednotlivých kategoriích výrobků
v roce 1997!
Firma
Celkem
Cukrovinky Koření
Maso /
Drůbež
Mléčné
výrobky
Mořské
produkty
Nápoje
Obilné
výrobky
Ana Trujillo
Emparedados y
helados
28 243,75
Kč
1 500,00
Kč
16 500,00
Kč
6 750,00 1 750,00 Kč
Kč
Antonio Moreno
Taquería
149
019,43 Kč
23 973,18 1 700,00 38 050,00
Kč
Kč
Kč
44 487,50
Kč
4 140,00 Kč 34 475,00 2 193,75 Kč
Kč
Around the Horn
160 9 380,00 Kč
172,50 Kč
Berglunds snabbköp
346
225,37 Kč
Blauer See
Delikatessen
26 995,00 2 000,00 Kč
Kč
Blondel pere et fils
195
447,00 Kč
34 475,00
Kč
…
…
…
27 360,00
Kč
14 049,00 5 940,00 23 652,00
Kč
Kč
Kč
34 825,00 12 482,50 Kč 21 375,00
Kč
Kč
…
…
77
1 743,75
Kč
28 250,00 26 500,00
Kč
Kč
41 400,00 39 210,00 Kč
185 4 375,00 Kč 32 100,00
Kč
499,37 Kč
Kč
3 725,00 7 350,00 Kč
Kč
10 260,00
Kč
Plodiny
8 550,00 1 950,00 Kč
Kč
46 962,50 36 536,50 Kč 19 098,00
Kč
Kč
…
…
…
3 420,00
Kč
48 115,00
Kč
…
…
14.2.2 Výběr podle vypočteného souhrnu
Cvičení 10. Vypište zaměstnance, kteří měli v posledním roce malou tržbu! (Nalezněte a vyberte
vhodný limit.)
(Limit např. 1 000 000,-Kč): Michael Suyama, Steven Buchanan
Cvičení 11. Vyberte zákazníky, kteří v roce 1997 utratili více než 300 000 Kč!
Firma (12 firem):, QUICK-Stop, Save-a-lot Markets, Ernst Handel, Mere Paillarde, Hungry
Owl All-Night Grocers, Rattlesnake Canyon Grocery, Simons bistro, Berglunds snabbköp,
HILARIÓN-Abastos, Folk och fä HB, Lehmanns Marktstand, Wartian Herkku
Cvičení 12. Najděte výrobek roku 1997! (Za který byla největší tržba)
NázevVýrobku: Côte de Blaye
14.2.3 Souhrny pro celou tabulku
Cvičení 13. Jaká je celková hodnota zboží objednaného do skladu? (Počítejte souhrn
JednotkováCena*JednotkyNaSkladě 65.)
359 437,50 Kč
Cvičení 14. Jaká je průměrná jednotková cena výrobků?
721,66 Kč
Cvičení 15. Jaká byla průměrná výše objednávky v roce 1997?
37 811,59 Kč
Cvičení 16. Jaký byl průměrný výkon zaměstnanců v roce 1997?
1 714 125,55 Kč
14.2.4 Spojení několika souhrnů
Cvičení 17. Jaký byl podíl celkového součtu dopravného a celkového součtu ceny zboží pro
jednotlivé země (ZeměPříjemce)?
Země příjemce SumOfDopravné SumOfMezisoučet podíl
Argentina
14 964,50 Kč
202 977,50 Kč 7,37%
Švédsko
80 940,00 Kč
1 362 378,48 Kč 5,94%
184 787,50 Kč
3 200 095,95 Kč 5,77%
6 728,50 Kč
119 936,25 Kč 5,61%
16 088,25 Kč
286 809,06 Kč 5,61%
Rakousko
Polsko
Portugalsko
…
…
…
řazeno sestupně
podle podílu
…
Cvičení 18. Porovnejte tržby zaměstnanců v Severní Americe a ve zbytku světa!
Zaměstnanec
bydlí v
v Severní Americe ve zbytku světa podíl
Fuller, Andrew
USA
861 387,50 Kč 3 302 056,37 Kč 26,09%
Callahan, Laura
USA
700 567,06 Kč 2 470 989,86 Kč 28,35%
Dodsworth, Anne
Velká Británie
454 787,87 Kč 1 477 913,76 Kč 30,77%
Buchanan, Steven Velká Británie
Leverling, Janet
65
410 528,75 Kč 1 311 465,78 Kč 31,30%
USA
1 219 952,07 Kč 3 850 369,00 Kč 31,68%
Peacock, Margaret USA
1 456 174,62 Kč 4 366 096,53 Kč 33,35%
Suyama, Michael
Velká Británie
Davolio, Nancy
USA
King, Robert
Velká Británie
530 744,49 Kč 1 317 083,73 Kč 40,30%
1 442 755,25 Kč 3 359 934,82 Kč 42,94%
944 344,31 Kč 2 165 879,05 Kč 43,60%
V databázi Northwind není nákupní cena výrobků, takže počítáme prodejní cenu.
78
14.2.5 Agregační funkce pro čas
Cvičení 19. Pro každého zákazníka nalezněte datum posledního nákupu!
Kód zákazníka
Firma
PosledníNákup
ALFKI
Alfreds Futterkiste
ANATR
Ana Trujillo Emparedados y helados
9.4.1998
ANTON
Antonio Moreno Taquería
28.1.1998
AROUT
Around the Horn
10.4.1998
BERGS
Berglunds snabbköp
BLAUS
Blauer See Delikatessen
…
…
4.3.1998
4.3.1998
29.4.1998
…
Cvičení 20. Kteří zákazníci v posledním čtvrtletí (tj. od 1.4.1998) nic nenakoupili ?
Firma (32 firem):, Ana Trujillo Emparedados y helados, Antonio Moreno Taquería,
Berglunds snabbköp, Blondel pere et fils, Bólido Comidas preparadas, Centro comercial
Moctezuma, Consolidated Holdings, Du monde entier, Familia Arquibaldo, Folies
gourmandes, France restauration, Furia Bacalhau e Frutos do Mar, Galería del
gastrónomo, GROSELLA-Restaurante, Hungry Coyote Import Store, Island Trading, La
corne d'abondance, Laughing Bacchus Wine Cellars, Lazy K Kountry Store, Let's Stop N
Shop, Magazzini Alimentari Riuniti, Mere Paillarde, Morgenstern Gesundkost, Océano
Atlántico Ltda., Seven Seas Imports, Split Rail Beer & Ale, Toms Spezialitäten, Tradiçăo
Hipermercados, Trail's Head Gourmet Provisioners, Victuailles en stock, Vins et alcools
Chevalier, Wellington Importadora
14.2.6 Počet různých hodnot
Cvičení 21. V kolika různých zemích letos (1998) jednotliví zaměstnanci prodávali?
Zaměstnanec
PočetZemí
Davolio, Nancy
17
Fuller, Andrew
17
Leverling, Janet
16
Peacock, Margaret
16
Buchanan, Steven
9
Suyama, Michael
9
King, Robert
15
Callahan, Laura
13
Dodsworth, Anne
13
14.3 Kritérium propojením
Cvičení 22. Ve kterých zemích se v roce 1997 prodával výrobek tohoto roku?
Země příjemce
Brazílie
Dánsko
Kanada
Mexiko
Německo
Švédsko
USA
79
14.4 Řešení cvičení
Zde naleznete SQL-kódy pro cvičení z této kapitoly. Tyto kódy jsou dostupné též na internetové
adrese
nb.vse.cz/~palovska/uzida/
Odtud je můžete kopírovat do Zobrazení SQL okna dotazů.
Cvičení 1.
SELECT DISTINCT Objednávky.ZeměPříjemce
FROM (Dodavatelé INNER JOIN Výrobky ON Dodavatelé.ČísloDodavatele = Výrobky.ČísloDodavatele)
INNER JOIN (Objednávky INNER JOIN [Rozpis objednávek] ON Objednávky.ČísloObjednávky = [Rozpis
objednávek].ČísloObjednávky) ON Výrobky.ČísloVýrobku = [Rozpis objednávek].ČísloVýrobku
WHERE (((Dodavatelé.Firma)="Zaanse Snoepfabriek"));
Cvičení 2.
SELECT DISTINCT Zákazníci.Země, Zákazníci.Firma
FROM Zákazníci INNER JOIN Objednávky ON Zákazníci.KódZákazníka = Objednávky.KódZákazníka
WHERE (((Year([DatumObjednávky]))=1998) AND (([DodatDne]-[DatumObjednávky])=14))
ORDER BY Zákazníci.Země, Zákazníci.Firma;
Cvičení 3.
SELECT DISTINCT Výrobky.ČísloVýrobku, Výrobky.NázevVýrobku
FROM Výrobky INNER JOIN (Objednávky INNER JOIN [Rozpis objednávek] ON
Objednávky.ČísloObjednávky = [Rozpis objednávek].ČísloObjednávky) ON Výrobky.ČísloVýrobku =
[Rozpis objednávek].ČísloVýrobku
WHERE (((Objednávky.DatumObjednávky) Between #5/1/1998# And #5/31/1998#));
Cvičení 4.
SELECT Dodavatelé.Firma AS Dodavatel, Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS
SumVýslednáCena
FROM Dodavatelé INNER JOIN (Výrobky INNER JOIN [Rozšířené podrobnosti objednávek] ON
Výrobky.ČísloVýrobku = [Rozšířené podrobnosti objednávek].ČísloVýrobku) ON
Dodavatelé.ČísloDodavatele = Výrobky.ČísloDodavatele
GROUP BY Dodavatelé.Firma, Dodavatelé.ČísloDodavatele;
Cvičení 5.
SELECT Dodavatelé.Firma AS Dodavatel, Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS
SumVýslednáCena
FROM Dodavatelé INNER JOIN ((Výrobky INNER JOIN [Rozšířené podrobnosti objednávek] ON
Výrobky.ČísloVýrobku = [Rozšířené podrobnosti objednávek].ČísloVýrobku) INNER JOIN Objednávky
ON [Rozšířené podrobnosti objednávek].ČísloObjednávky = Objednávky.ČísloObjednávky) ON
Dodavatelé.ČísloDodavatele = Výrobky.ČísloDodavatele
WHERE (((Objednávky.DatumObjednávky) Between #1/1/1998# And #12/31/1998#) AND
((Year([DatumObjednávky]))=1998))
GROUP BY Dodavatelé.Firma, Dodavatelé.ČísloDodavatele;
Cvičení 6.
TRANSFORM Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS SumVýslednáCena
SELECT Dodavatelé.ČísloDodavatele, Dodavatelé.Firma AS Dodavatel
FROM Dodavatelé INNER JOIN ((Výrobky INNER JOIN [Rozšířené podrobnosti objednávek] ON
Výrobky.ČísloVýrobku = [Rozšířené podrobnosti objednávek].ČísloVýrobku) INNER JOIN Objednávky
ON [Rozšířené podrobnosti objednávek].ČísloObjednávky = Objednávky.ČísloObjednávky) ON
Dodavatelé.ČísloDodavatele = Výrobky.ČísloDodavatele
80
GROUP BY Dodavatelé.ČísloDodavatele, Dodavatelé.Firma
PIVOT Year([DatumObjednávky]);
Cvičení 7.
TRANSFORM Sum([Mezisoučty objednávek].Mezisoučet) AS [Sum Of Mezisoučet]
SELECT Objednávky.ČísloZaměstnance
FROM Objednávky INNER JOIN [Mezisoučty objednávek] ON Objednávky.ČísloObjednávky =
[Mezisoučty objednávek].ČísloObjednávky
GROUP BY Objednávky.ČísloZaměstnance
PIVOT Year([DatumObjednávky]);
Cvičení 8. Řešeno dvěma kroky, kvůli rychlosti seskupování podle ČísloKategorie. (Samozřejmě
je možno řešit i jediným křížovým dotazem.)
Mezivýsledek, uložit jako cvičení08a:
SELECT Kategorie.ČísloKategorie, Kategorie.NázevKategorie, Objednávky.ZeměPříjemce,
Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS SumVyslednaCena
FROM Kategorie INNER JOIN (Výrobky INNER JOIN (Objednávky INNER JOIN [Rozšířené podrobnosti
objednávek] ON Objednávky.ČísloObjednávky=[Rozšířené podrobnosti objednávek].ČísloObjednávky)
ON Výrobky.ČísloVýrobku=[Rozšířené podrobnosti objednávek].ČísloVýrobku) ON
Kategorie.ČísloKategorie=Výrobky.ČísloKategorie
GROUP BY Kategorie.ČísloKategorie, Kategorie.NázevKategorie, Objednávky.ZeměPříjemce;
a pak další krok:
TRANSFORM Sum(cvičení08a.SumVyslednaCena) AS SumOfSumVyslednaCena
SELECT cvičení08a.ZeměPříjemce AS Výraz1, Sum(cvičení08a.SumVyslednaCena) AS Celkem
FROM cvičení08a
GROUP BY cvičení08a.ZeměPříjemce
PIVOT cvičení08a.NázevKategorie;
Cvičení 9. Oproti předchozímu příkladu je tento řešen v jediném kroku. Toto snadnější řešení je
někdy pomalejší, někdy ho nelze vůbec použít. (Sloupec KódZákazníka se v datovém listu následně
skryje.)
TRANSFORM Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS SumOfVýslednáCena
SELECT Zákazníci.KódZákazníka, Zákazníci.Firma, Sum([Rozšířené podrobnosti
objednávek].VýslednáCena) AS Celkem
FROM Zákazníci INNER JOIN (Kategorie INNER JOIN (([Rozšířené podrobnosti objednávek] INNER
JOIN Objednávky ON [Rozšířené podrobnosti objednávek].ČísloObjednávky =
Objednávky.ČísloObjednávky) INNER JOIN Výrobky ON [Rozšířené podrobnosti
objednávek].ČísloVýrobku = Výrobky.ČísloVýrobku) ON Kategorie.ČísloKategorie =
Výrobky.ČísloKategorie) ON Zákazníci.KódZákazníka = Objednávky.KódZákazníka
WHERE (((Year([DatumObjednávky]))=1997))
GROUP BY Zákazníci.KódZákazníka, Zákazníci.Firma
PIVOT Kategorie.NázevKategorie;
Cvičení 10.
SELECT Objednávky.ČísloZaměstnance, Zaměstnanci.Funkce, Sum([Mezisoučty
objednávek].Mezisoučet) AS CelkemTržba
FROM Zaměstnanci INNER JOIN (Objednávky INNER JOIN [Mezisoučty objednávek] ON
Objednávky.ČísloObjednávky = [Mezisoučty objednávek].ČísloObjednávky) ON
Zaměstnanci.ČísloZaměstnance = Objednávky.ČísloZaměstnance
WHERE (((Year([DatumObjednávky]))=1998))
81
GROUP BY Objednávky.ČísloZaměstnance, Zaměstnanci.Funkce
HAVING (((Sum([Mezisoučty objednávek].Mezisoučet))<1000000))
ORDER BY Sum([Mezisoučty objednávek].Mezisoučet) DESC;
Cvičení 11.
SELECT Zákazníci.KódZákazníka, Zákazníci.Firma, Sum([Mezisoučty objednávek].Mezisoučet) AS
Nákup1997
FROM Zákazníci INNER JOIN (Objednávky INNER JOIN [Mezisoučty objednávek] ON
Objednávky.ČísloObjednávky = [Mezisoučty objednávek].ČísloObjednávky) ON Zákazníci.KódZákazníka
= Objednávky.KódZákazníka
WHERE (((Year([DatumObjednávky]))=1997))
GROUP BY Zákazníci.KódZákazníka, Zákazníci.Firma
HAVING (((Sum([Mezisoučty objednávek].Mezisoučet))>300000))
ORDER BY Sum([Mezisoučty objednávek].Mezisoučet) DESC;
Cvičení 12.
SELECT TOP 1 Výrobky.ČísloVýrobku, Výrobky.NázevVýrobku, Sum([Rozšířené podrobnosti
objednávek].VýslednáCena) AS SumOfVýslednáCena
FROM Výrobky INNER JOIN (Objednávky INNER JOIN [Rozšířené podrobnosti objednávek] ON
Objednávky.ČísloObjednávky = [Rozšířené podrobnosti objednávek].ČísloObjednávky) ON
Výrobky.ČísloVýrobku = [Rozšířené podrobnosti objednávek].ČísloVýrobku
WHERE (((Year([DatumObjednávky]))=1997))
GROUP BY Výrobky.ČísloVýrobku, Výrobky.NázevVýrobku
ORDER BY Sum([Rozšířené podrobnosti objednávek].VýslednáCena) DESC;
Cvičení 13.
SELECT Sum([JednotkováCena]*[ObjednánoJednotek]) AS objednáno
FROM Výrobky;
Cvičení 14.
SELECT Avg(Výrobky.JednotkováCena) AS průměrnáCena
FROM Výrobky;
Cvičení 15.
SELECT Avg([Mezisoučty objednávek].Mezisoučet) AS průměrnáObjednávka
FROM [Mezisoučty objednávek] INNER JOIN Objednávky ON [Mezisoučty objednávek].ČísloObjednávky
= Objednávky.ČísloObjednávky
WHERE (((Year([DatumObjednávky]))=1997));
Cvičení 16. Řešeno dvěma kroky. První uložit jako cvičení16a:
SELECT Sum([Mezisoučty objednávek].Mezisoučet) AS Tržba
FROM Objednávky INNER JOIN [Mezisoučty objednávek] ON Objednávky.ČísloObjednávky =
[Mezisoučty objednávek].ČísloObjednávky
WHERE (((Year([DatumObjednávky]))=1997))
GROUP BY Objednávky.ČísloZaměstnance;
Druhý krok:
SELECT Avg([cvičení16a].Tržba) AS AvgOfTržba
FROM cvičení16a;
82
Cvičení 17. Tři kroky, první uložit jako cvičení17a:
SELECT Objednávky.ZeměPříjemce, Sum(Objednávky.Dopravné) AS DopravnéCelkem
FROM Objednávky
GROUP BY Objednávky.ZeměPříjemce;
Druhý krok, uložit jako cviční17b:
SELECT Objednávky.ZeměPříjemce, Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS
TržbaCelkem
FROM [Rozšířené podrobnosti objednávek] INNER JOIN Objednávky ON [Rozšířené podrobnosti
objednávek].ČísloObjednávky = Objednávky.ČísloObjednávky
GROUP BY Objednávky.ZeměPříjemce;
Třetí krok:
SELECT cvičení17a.ZeměPříjemce, cvičení17a.DopravnéCelkem, cvičení17b.TržbaCelkem,
[DopravnéCelkem]/[TržbaCelkem] AS podíl
FROM cvičení17a INNER JOIN cvičení17b ON cvičení17a.ZeměPříjemce = cvičení17b.ZeměPříjemce
ORDER BY [DopravnéCelkem]/[TržbaCelkem] DESC;
Je možné řešení i jediným krokem:
SELECT Objednávky.ZeměPříjemce, Sum(Objednávky.Dopravné) AS SumOfDopravné,
Sum([Mezisoučty objednávek].Mezisoučet) AS SumOfMezisoučet, Sum([Dopravné])/Sum([Mezisoučet])
AS podíl
FROM [Mezisoučty objednávek] INNER JOIN Objednávky ON [Mezisoučty objednávek].ČísloObjednávky
= Objednávky.ČísloObjednávky
GROUP BY Objednávky.ZeměPříjemce
ORDER BY Sum([Dopravné])/Sum([Mezisoučet]) DESC;
Ovšem takto by to bylo špatně!:
SELECT Zákazníci.KódZákazníka, Zákazníci.Firma, Sum(Objednávky.Dopravné) AS SumOfDopravné,
Sum([Rozšířené podrobnosti objednávek].VýslednáCena) AS SumOfVýslednáCena
FROM Zákazníci INNER JOIN ([Rozšířené podrobnosti objednávek] INNER JOIN Objednávky ON
[Rozšířené podrobnosti objednávek].ČísloObjednávky = Objednávky.ČísloObjednávky) ON
Zákazníci.KódZákazníka = Objednávky.KódZákazníka
GROUP BY Zákazníci.KódZákazníka, Zákazníci.Firma;
Cvičení 18. Řešeno třemi kroky, první uložit jako cvičení18a:
SELECT Objednávky.ČísloZaměstnance, Sum([Mezisoučty objednávek].Mezisoučet) AS SeverníAmerika
FROM [Mezisoučty objednávek] INNER JOIN Objednávky ON [Mezisoučty objednávek].ČísloObjednávky
= Objednávky.ČísloObjednávky
WHERE (((Objednávky.ZeměPříjemce) In ("USA","Kanada","Mexiko")))
GROUP BY Objednávky.ČísloZaměstnance;
Druhý krok, uložit jako cvičení18b:
SELECT Objednávky.ČísloZaměstnance, Sum([Mezisoučty objednávek].Mezisoučet) AS ZbytekSvěta
FROM [Mezisoučty objednávek] INNER JOIN Objednávky ON [Mezisoučty objednávek].ČísloObjednávky
= Objednávky.ČísloObjednávky
WHERE (((Objednávky.ZeměPříjemce) Not In ("USA","Kanada","Mexiko")))
GROUP BY Objednávky.ČísloZaměstnance;
Třetí krok:
SELECT cvičení18a.ČísloZaměstnance, Zaměstnanci.Země, cvičení18a.SeverníAmerika,
cvičení18b.ZbytekSvěta, [SeverníAmerika]/[ZbytekSvěta] AS podíl
83
FROM (cvičení18a INNER JOIN cvičení18b ON cvičení18a.ČísloZaměstnance =
cvičení18b.ČísloZaměstnance) INNER JOIN Zaměstnanci ON cvičení18a.ČísloZaměstnance =
Zaměstnanci.ČísloZaměstnance
ORDER BY [SeverníAmerika]/[ZbytekSvěta];
Cvičení 19.
SELECT Zákazníci.KódZákazníka, Zákazníci.Firma, Max(Objednávky.DatumObjednávky) AS
PosledníNákup
FROM Zákazníci INNER JOIN Objednávky ON Zákazníci.KódZákazníka = Objednávky.KódZákazníka
GROUP BY Zákazníci.KódZákazníka, Zákazníci.Firma;
Cvičení 20.
SELECT Zákazníci.KódZákazníka, Zákazníci.Firma, Max(Objednávky.DatumObjednávky) AS
PosledníNákup
FROM Zákazníci INNER JOIN Objednávky ON Zákazníci.KódZákazníka = Objednávky.KódZákazníka
GROUP BY Zákazníci.KódZákazníka, Zákazníci.Firma
HAVING (((Max(Objednávky.DatumObjednávky))<#3/31/1998#));
Jiná možnost je řešení je pomocí křížového dotazu, kde řádky tvoří zákazníci, sloupce čtvrtletí,
hodnoty jsou tržby. Ve sloupci s posledním čtvrtletím pak hledáme prázdná políčka.
Cvičení 21. Dva kroky, první uložit jako cvičení21a:
SELECT DISTINCT Objednávky.ČísloZaměstnance, Zákazníci.Země
FROM Zákazníci INNER JOIN Objednávky ON Zákazníci.KódZákazníka = Objednávky.KódZákazníka
WHERE (((Year([DatumObjednávky]))=1998));
Druhý krok:
SELECT cvičení21a.ČísloZaměstnance, Count(*) AS PočetZemí, Count(cvičení21a.Země) AS
CountOfZemě
FROM cvičení21a
GROUP BY cvičení21a.ČísloZaměstnance;
Cvičení 22. Využije se cvičení12:
SELECT DISTINCT Objednávky.ZeměPříjemce
FROM Objednávky INNER JOIN ([Rozpis objednávek] INNER JOIN cvičení12 ON [Rozpis
objednávek].ČísloVýrobku = cvičení12.ČísloVýrobku) ON Objednávky.ČísloObjednávky = [Rozpis
objednávek].ČísloObjednávky
WHERE (((Year([DatumObjednávky]))=1997));
84
15 Tématicky zaměřené úlohy
V této kapitole jsou naznačeny postupy řešení některých problémových okruhů, pro něž jsou
v databázi Řešení samostatné skupiny „Výjimky a závislosti“, „Zaměření zaměstnanců“, „Tendence
nákupů“, „Průběh cen“, „Porovnání charakteristik“.
15.1 Výjimky a závislosti
Tato skupina se dotýká tématiky hledání závislostí a nalézání výjimek. Toto je předmětem
samostatné disciplíny nazývané dobývání znalostí z databází (data-mining), my zde pouze
naznačíme uživatelské možnosti při použití dotazů do databáze.
Máme-li nějakou domněnku o statistické závislosti hodnot v nějakých polích na hodnotách v jiných
polích, nejlépe je vytvořit dotaz zobrazující všechna dotyčná pole, a podle polí, jež se domníváme,
že ovlivňují ta druhá, odpověď seřadíme. Pak prohlížením výsledku posoudíme, zda závislost
„vidíme“ či nikoli. V případě že se jedná o dvojici polí, může pomoci zobrazit výsledek do grafu.
Můžeme také vypočítat statistický průměr hodnot jednoho pole ve skupině dané hodnotou v jiném
poli.
Výjimky se hledají ještě nesnadněji, musíme mít nejprve představu o pravidle, z něhož hledáme
výjimku. Dotaz „Počty výrobků v objednávce“ je jediným ukázaným příkladem.
Další skupiny úloh jsou zaměřeny konkrétně.
15.2 Zaměření zaměstnanců
Tato skupina se zabývá otázkou, zde zákazníci mají „svého“ kontaktního zaměstnance, či zda
naopak je kontakt konkrétního zaměstnance se zákazníkem čistě náhodný.
Výsledek ukazuje dotaz „Počty zaměstnanců u zákazníků2“.
15.3 Tendence nákupů
V této skupině je pojata hypotéza, že pokud nějaký zákazník opakuje nákup nějakého druhu
výrobku, potom si ho oblíbil. Zajímá nás otázka, zda výrobky někým oblíbené jsou všeobecně více
prodávány. – Dotazy 1-1 až 1-5.
Další dotazy v této skupině přibírají do úvahy intervaly mezi jednotlivými nákupy stejného výrobku
jedním zákazníkem. Ukázány jsou možnosti dotazovacího jazyka databází (1-6 až 1-9), a také je
ukázáno, jak může být výhodné použít zpracování dat v tabulkovém kalkulátoru, a propojení
výsledků zpět do databáze – výsledek dotazu 2-1 je načten do sešitu MS Excel „Opakování
nákupů“, kde jsou vypočteny intervaly mezi nákupy. Tabulka „Intervaly“ propojuje vypočtená data
z listu 2 v sešitu „Opakování nákupů“.
Sešit „Opakování nákupů“ ve svém prvním listě ukazuje možnost filtrování dat v prostředí MS Excel. Toto
poněkud omezuje možnost automatického aktualizování propojených dat, lépe by bylo filtrovat data až
v databázovém programu (jak je tomu v případě podobné techniky ve skupině „Průběh cen“).
Dotaz 2-3 ukazuje stejný výsledek jako dotaz 1-8, jeho formulace je mnohem snazší. Navíc není
problém doplnit další statistické hodnoty, jako průměr, odchylku…
Dotaz 2-7 ukazuje prostřednictvím vnořeného datového listu nejucelenější pohled na problematiku
opakování nákupů stejného druhu výrobku.
15.4 Průběh cen
Tato skupina se zabývá průběhem cen výrobků v čase. Dotaz 1-1 vytváří uspořádaný pohled na
průběh cen výrobků zjištěný z jednotlivých objednávek. Ukazuje se i možnost zobrazení průběhu
85
cen jednotlivého výrobku v grafu. Výsledek tohoto dotazu je načten do sešitu MS Excel „Průběh
cen“.
V sešitu „Průběh cen“ je pomocí průběžného porovnávání cen jednotlivého výrobku nalezeno vždy
první a polední datum, kdy platila stejná cena (sloupce „Od“, „Do“). Řádky, v nichž je „Do“
nenulové, jsou ty, v nichž nalezneme potřebnou informaci o začátku a konci platnosti ceny.
Celá tabulka ze sešitu „Průběh cen“ je propojena do databáze MS Access jako tabulka Ceny, jsou
v ní tedy i „nepotřebné“ řádky. Ty jsou odfiltrovány kritériem v dotazu 1-8.
Dotazy 1-2 a 1-3 ověřují informaci, že v jednom dni vždy platila jedna cena výrobku.
Dotazy 1-4 a 1-5 ukazují, odkdy platí aktuální cena výrobků.
Oba předchozí dotazy jsou založeny na předpokladu, že nedošlo k výkyvu ceny a s následným
návratem k původní hodnotě. Dotaz 1-6 ukazuje, že u výrobku „Zaanse koeken“ to byl mylný
předpoklad.
Nejucelenější pohled na průběh cen výrobků ukazuje sestava „Průběh cen“, v níž se v grafech
přizpůsobuje měřítko na svislé ose skutečným hodnotám cen, ale vodorovná osa času je pro
všechny výrobky stejná.
15.5 Porovnání charakteristik
Toto je nejsofistikovanější skupina, užití postupů v ní ukázaných připadá v úvahu ve velmi
specifických úlohách.
Obecně jde o to, že ze záznamů o činnostech entit můžeme odvodit určitou charakteristiku těchto
entit, a tu pak s něčím porovnávat.
Ve všech případech se využijí křížové dotazy.
V dotazech 1-1 až 1-5 se zjišťuje, o jaké kategorie výrobků projevují zákazníci zájem. Dotaz 1-2 je
pomocný pro dotaz 1-4, jenž vytváří pro každého zákazníka pole s binárním kódem jeho
charakteristiky. Výsledek tohoto dotazuje uložen do tabulky char_zák, aby bylo možno vnořit jeho
datový list do dotazu 1-5.
Dotazy 2-1 až 2-3 se zabývají podobnou tématikou, tentokrát jde o to, se kterými zákazníky v USA
přicházeli zaměstnanci do styku.
Dotaz 2-1 na rozdíl od dotazu 1-2 připouští prázdné hodnoty ve výsledku, z čehož vyplynou
následně problémy. Zatímco seskupení podle prázdných hodnot (v dotazu 2-2) nedělá problémy,
porovnání dvou prázdných hodnot (dotaz 2-3) nedává výsledek „pravda“, ale „neznámý“, takže dva
řádky s prázdnou hodnotou v propojovacích polích by nebyly propojeny!
Pamatujte si:
Null porovnáno s čímkoli dává neznámý výsledek, nikdy „pravda“, ani v případě Null=Null.
Null hodnoty ve výrazech způsobí Null hodnotu výsledku (viz výrazy v sestavě „Souhrny podle zemí
v jednotlivých letech“).
Null hodnoty v agregovaných polích souhrnných dotazů nejsou problémem, agregace jsou počítány pouze
z neprázdných hodnot.
86
Rejstřík
agregační funkce, 30
propojení mezivýsledků, 47
datová kostka, 42
propojovací pole datových listů, 45
datový list, 10
přejmenování pole v dotazu, 22
datový typ, 6
přesný číselný typ, 11
jedinečné hodnoty, 21
relace, 9, 13
klíč tabulky, 6, 10
relační databáze, 6
kritérium Is Null, 54
řazení v datovém listu, 19
křížová tabulka, 33
schéma databáze, 9, 14
lupa, 23
SQL-kód, 19
mřížka dotazu, 17
titulek, 10
nepřesný číselný typ, 11
titulek pole, 22
odpověď na dotaz, 16
vlastnosti pole, 22
parametr dotazu, 26
vnořený datový list, 45
pole, 6
vzorová databáze Northwind, 5, 7
polospojení, 56
záznam, 6
pravidlo propojení, 56
zdroj záznamů sestavy, 62
87

Podobné dokumenty

Vodovod Lešany - protokol o zkoušce

Vodovod Lešany - protokol o zkoušce soP Ko 9oo (ČsN EN Iso 9308-r )

Více

Stiahnuť - Vinohrady nad Váhom

Stiahnuť - Vinohrady nad Váhom Interné Číslo čísloobjednávky Dátum vystavenia Suma Dodávateľ

Více

IBM SPSS Statistics Base

IBM SPSS Statistics Base IBM SPSS Statistics Base Vám také nabízí restrukturalizaci datového souboru pro potřeby analýzy. Například máte-li datový soubor s více řádky pro jeden subjekt, typické pro transakční data, data ag...

Více

databázové technologie (db) – příprava na szz

databázové technologie (db) – příprava na szz Relace R (tabulka) se nachází v 1. NF, pokud všechny komponenty n-tice jsou atomické (tj. nejsou opět relací). Tzn. do každého pole lze dosadit pouze jednoduchý datový typ. Podmínka 1. NF není spln...

Více

Databázové systémy I.

Databázové systémy I. být v databázi uloženo. Definuje se účel (k čemu databáze slouží) a úkony které může uživatel s daty provádět Výsledkem první fáze je konceptuální model který popisuje data na abstraktní úrovni. Vý...

Více

REHABILITAČNÍ PORADA FOKUS FEDERÁL + AKS VEDOUCÍ

REHABILITAČNÍ PORADA FOKUS FEDERÁL + AKS VEDOUCÍ jedná se o náležitosti smlouvy se o právní úkon, ve kterém by klienta opatrovník měl klienta zastupovat; pokud není stanoveno, že opatrovník zastupuje klienta v této konkrétní věci, nemá nárok na v...

Více

AGILITY - Zlin, 7.5.2011 vysledky

AGILITY - Zlin, 7.5.2011 vysledky #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! #DIV/0! 0 #DIV/0!

Více

SLOVNÍK – European Social Policy 2002

SLOVNÍK – European Social Policy 2002 Příjemci dávek Peněžní dávky Dávky ne-peněžního charakteru (např. zdrav. služby atd.) Stínová ekonomika Odliv kvalifikované pracovní síly do zahraničí nebo do lépe placeného odvětví Větve, vědní ob...

Více