Pola Obliczeniowe w Kwerendach
Wyrażenia, funkcje warunkowe, daty i zaokrąglanie w kwerendzie — czyli jak policzyć to, czego nie ma wprost w tabeli.
Polecenie prosi o wartość, której nie ma w żadnej kolumnie: wartość zamówienia, cenę po rabacie, wiek z daty urodzenia, udział procentowy. Wtedy dopisujesz kolumnę liczoną w kwerendzie. Sam wzór jest zwykle banalny — punkty lecą na drobiazgach: alias inny niż narzucony w poleceniu, zaokrąglenie zrobione formatowaniem zamiast obliczeniem, próba użycia aliasu w warunku, wartość pusta, która niszczy cały wiersz. Ten materiał przechodzi przez te miejsca po kolei.
1. Kiedy potrzebujesz pola obliczeniowego
Rozpoznanie jest proste: jeśli w poleceniu pada wartość, której nie widzisz w żadnej kolumnie tabeli, musisz ją wyliczyć. Nowa kolumna powstaje w locie, przy każdym otwarciu kwerendy — dane w tabeli zostają nietknięte i o to właśnie chodzi.
SELECT Nazwa,
Cena,
Ilosc,
Cena * Ilosc AS Wartosc
FROM Zamowienia;W wierszu Pole pustej kolumny wpisujesz od razu nazwę wyniku i dwukropek, a po nim wyrażenie: Wartosc: [Cena]*[Ilosc]. Nazwy pól bierzesz w nawiasy kwadratowe — obowiązkowo, jeśli zawierają spację lub polski znak. Jeżeli wyrażenie jest długie, użyj Konstruktora wyrażeń (prawy przycisk w komórce Pole), który podpowiada nazwy tabel i funkcji i nie pozwala się pomylić w pisowni.
Nazwa nadana przez AS albo dwukropek bywa wprost narzucona w poleceniu — wtedy musi zgadzać się co do znaku, z wielkością liter włącznie. To najprostszy punkt do zdobycia i najgłupszy do stracenia.
2. Warunki wewnątrz zapytania
Gdy wynik zależy od warunku — rabat tylko powyżej progu, inna stawka dla innej kategorii — policz to w zapytaniu, a nie ręcznie w arkuszu. Access ma do tego funkcję IIf, SQL konstrukcję CASE WHEN.
SELECT Nazwa,
Cena,
CASE WHEN Cena > 100 THEN Cena * 0.9 ELSE Cena END AS Cena_po_rabacie
FROM Produkty;Cena_po_rabacie: IIf([Cena]>100; [Cena]*0,9; [Cena]) Przedzial: IIf([Wiek]<18; "uczen"; IIf([Wiek]<65; "dorosly"; "senior"))
Zwróć uwagę na dwa szczegóły w zapisie dla Accessa: argumenty funkcji oddziela średnik, a część dziesiętną — przecinek, bo tak ustawiony jest język systemu na stanowisku egzaminacyjnym. W Widoku SQL tej samej bazy obowiązuje już kropka i przecinek między argumentami. Przy trzech i więcej przedziałach zamiast zagnieżdżać IIf wygodniej użyć funkcji Switch, która bierze pary warunek–wynik.
3. Puste pola potrafią zepsuć cały wiersz
Wartość pusta nie jest zerem. Dowolne działanie arytmetyczne z jej udziałem daje w wyniku znowu wartość pustą, więc jedno nieuzupełnione pole potrafi wyczyścić całą kolumnę obliczeniową. Dlatego przy danych importowanych z pliku prawie zawsze warto zabezpieczyć wyrażenie.
Wartosc: [Cena] * Nz([Ilosc]; 0) -- Access SELECT Cena * COALESCE(Ilosc, 0) AS Wartosc FROM Zamowienia; -- SQL
W Accessie [Imie] + " " + [Nazwisko] zwróci pustkę, jeśli któreś z pól jest puste. Operator & traktuje brak wartości jak pusty napis i zwróci to, co jest: Osoba: [Imie] & " " & [Nazwisko]. W standardowym SQL tę rolę pełni || lub funkcja CONCAT.
4. Zaokrąglanie, czyli pułapka z wieloletnim stażem
Polecenie mówi „wynik podaj z dokładnością do dwóch miejsc po przecinku”. Formatowanie kolumny tego nie załatwia — zmienia tylko wygląd, a wartość pod spodem zostaje pełna i egzaminator porównujący liczby zobaczy co innego, niż widzisz ty. Zaokrąglaj w wyrażeniu.
Srednia_zaokr: Round([Suma]/[Liczba]; 2) -- liczba, mozna po niej sortowac Kwota_tekst: Format([Wartosc]; "0,00") -- TEKST, sortuje sie alfabetycznie
Uwaga na połówki. Funkcja Round w Accessie zaokrągla „do najbliższej parzystej”: Round(2,5; 0) daje 2, a Round(3,5; 0) daje 4. Przy kwotach, gdzie ma być zwykłe zaokrąglanie w górę, użyj Int([x]*100 + 0,5)/100 albo policz ręcznie sporną wartość i wpisz ją do pliku z odpowiedziami. To jedna z tych różnic, które potrafią rozjechać wynik o grosz — a grosz wystarczy, żeby stracić punkt.
5. Daty i procenty
Rok: Year([Data_zamowienia])
Miesiac: Month([Data_zamowienia])
Kwartal: DatePart("q"; [Data_zamowienia])
Dni_od_zamowienia: DateDiff("d"; [Data_zamowienia]; Date())
Udzial_proc: Round([Wartosc] / [Suma_calosci] * 100; 1)Wieku nie liczy się przez DateDiff("yyyy"; ...) — ta funkcja odejmuje same numery lat, więc osoba urodzona w grudniu dostanie rok za dużo przez jedenaście miesięcy. Jeśli zadanie pyta o wiek ukończony, policz różnicę lat i odejmij jeden dla tych, którzy w tym roku jeszcze nie mieli urodzin, albo podziel DateDiff("d"; ...) przez 365,25 i użyj Int.
Przy udziale procentowym pamiętaj, co dokładnie ma być w kolumnie: liczba 23 czy ułamek 0,23. Polecenie zwykle podaje przykład wyniku — to on rozstrzyga, a nie przyzwyczajenie.
6. Gdy na stanowisku jest LibreOffice Base
Lista oprogramowania CKE dopuszcza oba pakiety, więc warto znać drugą składnię. W Base wyrażenie wpisujesz w wierszu Pole projektanta kwerend albo w widoku SQL, a nazwę wyniku w wierszu Alias.
SELECT "Imie" || ' ' || "Nazwisko" AS "Osoba",
ROUND("Cena" * "Ilosc", 2) AS "Wartosc",
CASE WHEN "Cena" > 100 THEN "Cena" * 0.9 ELSE "Cena" END AS "Po_rabacie",
YEAR("Data_zamowienia") AS "Rok"
FROM "Zamowienia";Różnice, które trzeba zapamiętać: nazwy pól w cudzysłowie prostym, teksty w apostrofach, kropka dziesiętna, przecinek między argumentami, brak IIf i Nz — ich rolę pełnią CASE WHEN i COALESCE.
7. Gdzie najczęściej giną punkty
- Alias w warunku.
WHEREnie widzi nazwy nadanej przezAS, bo warunek jest sprawdzany zanim powstanie kolumna. Powtórz całe wyrażenie w kryterium albo — przy grupowaniu — użyjHAVING. WORDER BYalias działa normalnie. - Formatowanie zamiast zaokrąglenia tam, gdzie polecenie mówi o kwocie w złotych i groszach.
- Dzielenie przez zero przy danych z pliku. Zabezpiecz warunkiem:
IIf([Ilosc]=0; 0; [Suma]/[Ilosc]). - Zmiana danych w tabeli zamiast policzenia ich w kwerendzie. Zadanie prawie zawsze wymaga, żeby dane źródłowe pozostały nietknięte.
- Literówka w nazwie pola. Access zapyta wtedy o wartość parametru w okienku — to nie jest funkcja, tylko sygnał, że takiego pola nie ma. Zamknij okno i popraw pisownię.
- Brak kolumny w wyniku. Jeśli polecenie wymienia trzy kolumny, w wyniku mają być dokładnie trzy — pomocnicze odznacz w wierszu Pokaż.
Plan pracy na 210 minut, kolejność rozwiązywania i format plików wynikowych, na którym najłatwiej stracić punkty.
Korepetycje z informatyki
Zdajesz maturę rozszerzoną z informatyki?
Prowadzimy indywidualne przygotowanie do matury z informatyki — algorytmy, Python i C++, bazy danych i arkusz kalkulacyjny. Zajęcia online, na arkuszach CKE. Zobacz program i cennik.
Zobacz korepetycje z informatykiUczysz się w technikum informatycznym? Prowadzimy też przygotowanie do kwalifikacji INF.02, INF.03 i INF.04. Zobacz egzaminy zawodowe →
Nadal czujesz się niepewnie?
To tylko jeden z pewniaków. Na kursie przechodzimy przez nie wszystkie, krok po kroku, aż poczujesz ten spokój.
Pomóżcie mi zdać maturę!