Przejdź do treści
ŚredniWaga: 3-5 pkt

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;
To samo w siatce projektowej

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
Sklejanie tekstu: & zamiast +

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. WHERE nie widzi nazwy nadanej przez AS, bo warunek jest sprawdzany zanim powstanie kolumna. Powtórz całe wyrażenie w kryterium albo — przy grupowaniu — użyj HAVING. W ORDER BY alias 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ż.
Przeczytaj też
Zadania praktyczne na maturze — jak się przygotować

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 informatyki

Uczysz 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ę!