Lekérdezések
Választó lekérdezések
Csoportosítás, összesítő függvények
Sokszor szükség van arra, hogy az adatbázisban szereplő adatokat csoportosítva jelenítsük meg, és hozzá számoljunk is ki valamit. Az ilyen feladatok megoldására szolgálnak a QBE rács Összesítés sorában található összesítő függvények és záradékok. Az Összesítés sor alapértelmezetten nem látszik. Ahhoz, hogy bekapcsolhassuk, a Lekérdezéstervezőben a Tervezés fülön rá kell kattintanunk az Összesítés gombra.
A megjelent Összesítés sorban ezután összesítő függvények és záradékok közül válogathatunk. Nézzük meg, melyik függvény vagy záradék mire szolgál!
Összesítő függvények:
- Sum: a mezőben szereplő értékek összegét adja vissza.
- Avg: a mezőben szereplő értékek átlagát adja vissza.
- Min: a mezőben szereplő értékek közül a legkisebbet adja vissza.
- Max: a mezőben szereplő értékek közül a legnagyobbat adja vissza.
- Count: a mezőben szereplő értékek darabszámát adja vissza.
- StDev: a mezőben előforduló értékek szórását adja vissza.
- Var: a mezőben előforduló értékek szórásnégyzetét adja vissza.
- First: az első rekordban lévő értéket adja vissza.
- Last: az utolsó rekordban lévő értéket adja vissza.
Záradékok:
- Group by: azon mezők szerint csoportosítja a lekérdezés eredményét, ahol az Összesítés sorban a Group by záradék szerepel. Abban az esetben, ha a lekérdezésben szereplő mezők közül akár csak egyre is alkalmazunk összesítő függvényt, akkor a többi mezőnél a Group by záradékot kell beállítanunk, különben a lekérdezés nem fog működni.
MegjegyzésEnnek oka, hogy a QBE rács felület mögött SQL utasítások hajtódnak végre, ez pedig alapvető szabály egy SQL lekérdezés készítésekor.
- Expression: ezt a záradékot olyan számított mezők esetén kell használni, melyek tartalmaznak összesítő függvényeket.
- Where: ezt a záradékot olyan mezőkre kell alkalmazni, amelyre feltételt szabunk meg, viszont nem csoportosítunk velük, és nem is tartalmaznak összesítő függvényt.
Az összesítő függvények és a záradékok rövid áttekintése után nézzünk néhány példafeladatot!
OKTV 2003/2004. 2. forduló 3. feladat (Síkölcsönző) G részfeladat
FeladatEbben a feladatban egy olyan lekérdezést kell készíteni, ami kiszámolja, hogy egy ügyfélnek mennyit kell fizetnie a kölcsönzései után.
PéldaJavasolt megoldás:
Megoldási terv:
Elsőként el kell döntenünk, hogy mely táblákat kell felhasználnunk, majd miután ez megvan, hozzá kell adnunk a lekérdezéshez a megjelenítendő mezőket, valamint ki is kell számolnunk az ügyfél által fizetendő összeget. A számítás módjában segít a feladat is: a kölcsönzések darabszámát, időtartamát és a bérelt eszköztípusok árát kell felhasználni.
Javasolt megoldás lépései:
- Kattintsunk a Létrehozás fülre, majd ott a Lekérdezéstervező gombra!
- Mivel az ügyfelek nevére szükség van, ezért adjuk hozzá a lekérdezéshez az Ügyfél táblát! A kölcsönzés időtartama (Hány_hét) a Kölcsönzés, az eszköztípusok ára az Eszköztípus táblákban található, így ezeket is hozzá kell adnunk a lekérdezéshez. Ezeken kívül még az Eszköz táblára is szükségünk lesz. Ennek az az oka, hogy a Kölcsönzés és Eszköztípus táblák az Eszköz táblán keresztül vannak összekapcsolva, és ha kihagynánk a lekérdezésből, akkor megszűnne a két tábla közötti kapcsolat.
- Adjuk hozzá a lekérdezéshez az Ügyfél tábla Név mezőjét!
- Ezután kattintsunk a szalagon a Tervezés fülön az Összesítés gombra! Ezzel megjelenik az Összesítés sor a rácson.
- A Név mezőnél állítsuk be az összesítéshez a Group by záradékot, hiszen ügyfelenként kell kiszámolnunk, hogy mennyit kell fizetniük.
- Kattintsunk jobb egérgombbal a Név mező mellett található üres mezőbe, majd a legördülő menüben válasszuk ki a Szerkesztés menüpontot! Ezzel belépünk a Kifejezésszerkesztőbe, ahol létre tudunk hozni mindenféle számított mezőt.
- Először is, adjunk a számított mezőnek nevet! Mivel az ügyfelenként fizetendő összeget kell kiszámítanunk, ezért legyen a mező neve az, hogy Összes_fizetendő. A szöveg után tegyünk kettőspontot (:), ez jelzi a rendszernek, hogy ez a szöveg lesz a számított mező neve.
- A következő lépésben számoljuk ki, hogy egy ügyfél egy kölcsönzött termékért mennyit kell, hogy fizessen. Az adatbázisban nyilván van tartva, hogy egy heti kölcsönzésért mennyit kell fizetni (Heti_ár), valamint az is, hogy az ügyfél hány hétre kölcsönözte ki az adott terméket (Hány_hét). Ebből következik, hogy az egy termékért fizetendő összeg a Heti_ár és a Hány_hét mezők értékeinek szorzata.
- Álljunk a kurzorral a mezőnév után, majd a Kifejezéselemek között tallózzunk rá az adatbázisfájlunk táblái között a Kölcsönzés táblára, majd a Kifejezéskategóriák között kattintsunk duplán a Hány_hét mezőre! Ekkor megjelenik a szerkesztőben a mező.
- Gépeljünk utána egy csillag (*) karaktert – ez a szorzás operátor –, majd ismételjük meg az előző lépést, csak ezúttal az Eszköztípus tábla Heti_ár mezőjével tegyük ezt. Ha elkészültünk, akkor ezt kell látnunk a képernyőn:
MegjegyzésFelvetődhetne a kérdés, hogy a * miért szorzás operátorként viselkedik, ha korábban már láttuk, hogy a * egy helyettesítő karakter. Ez igaz, viszont jelen esetben nem a Like összehasonlító kifejezésben és nem is idézőjelek között – tehát szövegként – használjuk, hanem szám típusú mezők között.
- Már csak annyit kell tennünk, hogy az egyes termékek kölcsönzési díját összeadjuk. Ehhez a Sum összesítő függvényt kell használnunk. Nyissuk meg a Kifejezéselemek között a Függvényeket, majd ott kattintsunk a Beépített függvényekre! Ezután a Kifejezésértékek között keressük meg a Sum függvényt, és kattintsunk rá duplán! Ekkor az általunk készített kifejezés után az alábbi kifejezést szúrja be a program: «Kif» Sum(«kifejezés»). Töröljük ki a Sum előtti «Kif» szöveget, majd jelöljük ki az általunk elkészített szorzat kifejezést, és vágjuk ki! Utána kattintsunk a zárójelek közötti «kifejezés» szövegre, majd illesszük be oda a szorzatot. Ha készen vagyunk, ezt kell látnunk:
- Ha ezzel megvagyunk, kattintsunk az Ok gombra a Kifejezésszerkesztőben! Ezzel visszatérünk a QBE rácshoz, és láthatjuk, hogy a lekérdezésünk immár két mezőt jelenít meg. Ha viszont most megpróbálnánk átváltani Adatlap nézetre, akkor az Access azzal a hibaüzenettel fogadna, hogy Összesítő függvény nem alkalmazható GROUP BY záradékban. Ezt úgy tudjuk megszüntetni, hogy az Összesen_fizetendő mező Összesítés sorában a Group by-t átállítjuk Expressionre. Ezt azért kell megtennünk, mert – mint ahogy azt korábban már tárgyaltuk – Expression záradékot kell használnunk minden olyan számított mezőnél, amely összesítő függvényt tartalmaz. Ez a számított mező pedig a Sum összesítő függvényt használja.
- Ha átállítottuk a záradékot, és átváltunk Adatlap nézetre, akkor a lekérdezés gond nélkül lefut, és ügyfelenként megjeleníti a fizetendő kölcsönzési díjat.
Ezzel pedig el is érkeztünk a részfeladat végéhez. Mentsük el a lekérdezést a megadott néven, és zárjuk be.
OKTV 2003/2004. 3. forduló 13. feladat (Jelentkezési adatbázis) F részfeladat
FeladatA feladatban egyetlen lekérdezéssel kell meghatároznunk, hogy melyek azok a szobák, melyekben csak egy ember száll meg.
PéldaJavasolt megoldás:
Megoldási terv:
Mint már korábban, úgy itt is azzal kell kezdenünk, hogy meghatározzuk, mely táblákra lesz szükségünk az adatbázisból. Majd miután hozzáadtuk a lekérdezéshez, kiválasztjuk a szükséges mezőket, alkalmazzuk a megfelelő összesítő függvényt, és megfogalmazzuk a feltételeket.
Javasolt megoldás lépései:
- Kattintsunk a Létrehozás fülre, majd itt a Lekérdezéstervező gombra!
- A feladatot elolvasva láthatjuk, hogy két táblára lesz szükségünk: a tSzállásra, hiszen ebben vannak eltárolva az egyes szobák, és a tRésztvevőkre, mert ebben tároljuk, hogy az egyes résztvevők melyik szobában szállnak meg.
- Adjuk hozzá a lekérdezéshez a tSzállás táblából az Épület és a Szobaszám mezőket, valamint a tRésztvevők táblából a Szállás mezőt.
- Kattintsunk a szalagon az Összesítés gombra (Tervezés fül)!
- Mivel arra vagyunk kíváncsiak, hogy mely szobákban szállt meg csak egy ember, ezért az Épület és Szobaszám mezőknél állítsuk be a Group by záradékot az Összesítés sorban. Így e szerint a két mező szerint lesznek csoportosítva az adatok.
- Nincs más dolgunk, minthogy meghatározzuk, hányan laknak az egyes szobákban. A tRésztvevő tábla Szállás mezőjére alkalmazzuk a Count összesítő függvényt! Ez megszámolja, hogy az egyes szobákban hányan laknak.
- Nekünk viszont arra van szükségünk, hogy csak azokat a szobákat adja vissza a lekérdezés eredményül, melyekben csak egy ember szállt meg. Ezért a Szállás mező feltétel sorába írjunk egy 1-est! Ha most átváltunk Adatlap nézetre, láthatjuk, hogy csak azok a szobák maradtak bent, melyekben csak egy személy szállt meg.
- Viszont a feladat azt kérte, hogy csak a szobákat jelenítsük meg, a benne megszállók számát ne. Váltsunk vissza Tervező nézetre, és a Szállás mezőnél vegyük ki a pipát a Megjelenítés sorból! A lekérdezés most így néz ki:
- Zárjuk be a lekérdezést, és mentsük a megadott néven!
Ezzel kész is van a részfeladat.
OKTV 2005/2006. 3. forduló 10. feladat (Járatok) D részfeladat
FeladatA feladatban egy olyan lekérdezést kell készítenünk, amely a járatok mellé kiírja az indulási és a végállomásra érkezési időt is. Fontos kikötés – és egyben könnyítés –, hogy nincs olyan járat, ami éjfélkor is közlekedne.
PéldaJavasolt megoldás lépései:
- Készítsünk egy új lekérdezést a Létrehozás fülön lévő Lekérdezéstervező gombra kattintva!
- Adjuk hozzá a lekérdezéshez a Menetrend táblát! A tábla Érkezés mezője tartalmazza, hogy az adott járat mikor érkezik meg az adott településre. A Járatszám mező pedig azonosítja az egyes járatokat.
- Adjuk hozzá a lekérdezéshez a Járatszám mezőt, majd kétszer az Érkezés mezőt. Azért kell kétszer, mert az adott járatnál az Érkezés mezőben szereplő legkorábbi érkezési időpont lesz a járat indulási időpontja az egyik, míg a legkésőbbi időpont a járat érkezési időpontja a másik végállomásra.
- Kapcsoljuk be a rácsfelületen az Összesítés sort (Tervezés fül, Összesítés gomb)!
- Mivel járatonként kell meghatározni az indulási és érkezési időt, ezért a Járatazonosító mező Összesítés sorában állítsuk be a Group by záradékot!
- Ezután határozzuk meg az egyes járatok indulási időpontjait az egyik végállomásról! Az első Érkezés mező Összesítés sorában állítsuk be a Min összesítő függvényt!
- Nem maradt más hátra, minthogy meghatározzuk az egyes járatok érkezési időpontjait a másik végállomásukra. Állítsuk be a másik Érkezés mező Összesítés sorában a Max összesítő függvényt!
- Bár a feladat nem kéri, azért, hogy a lekérdezés eredménye informatívabb legyen, célszerű lenne elnevezni azokat a mezőket, amelyeken a Min és Max összesítő függvényeket alkalmaztuk. Kattintsunk be az első Érkezés mezőnév elé, és gépeljük be azt, hogy Indulás, majd tegyünk utána kettőspontot (:). A kettőspont jelzi, hogy az előtte lévő szöveg lesz a mező neve. Tegyük meg ugyanezt a másik Érkezés mezőnél is, csak oda az Érkezés szöveget gépeljük be, és ne feledkezzünk meg utána a kettőspontról sem.
MegjegyzésAlapesetben ugyanis a rendszer a következő elnevezést alkalmazza: <függvénynév>of<mezőnév>. A fenti példában ez úgy nézne ki, hogy MaxOfÉrkezés és MinOfÉrkezés.
Ha mindent jól csináltunk, akkor az alábbi képet kell látnunk a tervező nézetben:
Ezzel pedig be is fejeztük a részfeladatot.
FeladatTovábbi, hasonló módon megoldható feladatok:
Vissza a tartalomjegyzékhez