Przejdź do treści

Listopadowa cena: matura z informatyki za 100 zł zamiast 120 zł za lekcję. Zgłoś się do 30.11. Umów bezpłatną konsultację →

TrudnyWaga: 4-6 pkt

Kwerendy agregujące i GROUP BY

SUM, COUNT, AVG w podziale na grupy, różnica między WHERE a HAVING oraz to, jak agregaty traktują puste pola. Jeden z najpewniejszych punktów w zadaniu z bazy.

Agregacja wraca w każdym arkuszu, bo jednym zapytaniem odpowiada na pytania typu „ile”, „średnio” i „najwięcej”. Punkty w tym miejscu tracimy rzadko przez brak pomysłu, a prawie zawsze przez trzy rzeczy: pomylenie filtra przed grupowaniem z filtrem po grupowaniu, dołożenie do wyniku kolumny, która nie jest ani polem grupującym, ani agregatem, oraz przeoczenie pustych pól, które agregaty po cichu pomijają. Ten materiał układa to w schemat, który da się wykonać pod presją czasu.

1. Kiedy w ogóle potrzebujesz agregacji

Rozpoznanie jest proste: jeśli w poleceniu pada „ile”, „łącznie”, „średnio”, „najwięcej” albo „dla każdego”, to zadanie jest agregacyjne. Zwrot „dla każdego” wskazuje dodatkowo pole, po którym grupujesz.

  • „Ile zamówień złożył każdy klient” — grupujesz po kliencie, liczysz rekordy.
  • „Jaka jest średnia ocena w każdej klasie” — grupujesz po klasie, liczysz średnią.
  • „Jaki był łączny obrót w poszczególnych miesiącach” — grupujesz po wartości wyliczonej z daty.
  • „Ile wynosi suma wszystkich zamówień” — bez grupowania, sam agregat, jeden wiersz wyniku.

2. Pięć funkcji, które wystarczą

SELECT Klasa,
     COUNT(*)      AS Uczniow,     -- liczba rekordow w grupie
     COUNT(Ocena)  AS Z_ocena,     -- liczba uzupelnionych ocen
     AVG(Ocena)    AS Srednia,
     MIN(Ocena)    AS Najnizsza,
     MAX(Ocena)    AS Najwyzsza,
     SUM(Punkty)   AS Razem
FROM Uczniowie
GROUP BY Klasa
ORDER BY Srednia DESC;

W siatce projektowej to samo ustawiasz przyciskiem Sumy: kolumna Klasa dostaje „Grupuj według”, pozostałe wybraną funkcję. Nazwy kolumn Access tworzy automatycznie, w stylu SumaOfPunkty — jeśli polecenie podaje własną nazwę, ustaw ją przez dwukropek albo AS.

3. Reguła: grupujesz albo liczysz

Każda kolumna wyniku musi być polem grupującym albo wynikiem funkcji agregującej. Dołożenie zwykłej kolumny, na przykład numeru pojedynczego zamówienia, rozbija grupy: zamiast jednego wiersza na klienta dostaniesz tyle wierszy, ile ma zamówień.

Objaw w praktyce

Spodziewasz się kilkunastu wierszy, a widzisz setki. Sprawdź wtedy, czy w siatce nie ma kolumny z ustawieniem „Grupuj według”, która powinna była zostać policzona albo w ogóle usunięta z wyniku.

4. WHERE czy HAVING — test jednego wiersza

Zadaj sobie pytanie: czy ten warunek da się sprawdzić, patrząc na jeden wiersz danych? Jeśli tak, to WHERE. Jeśli trzeba najpierw zobaczyć całą grupę, to HAVING.

SELECT k.Nazwisko, COUNT(*) AS Ile, SUM(z.Wartosc) AS Razem
FROM Klienci AS k
INNER JOIN Zamowienia AS z ON k.ID = z.ID_klienta
WHERE YEAR(z.Data) = 2026          -- warunek na pojedynczym zamowieniu
GROUP BY k.Nazwisko
HAVING COUNT(*) >= 3               -- warunek na calej grupie
ORDER BY Razem DESC;
W siatce projektowej

Kolumna ustawiona na „Gdzie” filtruje przed zgrupowaniem i nie pojawia się w wyniku — to odpowiednik WHERE. Kryterium wpisane przy kolumnie z funkcją, na przykład >=3 przy Policz, działa po zgrupowaniu i odpowiada HAVING.

5. Puste pola i liczenie różnych wartości

Funkcje agregujące pomijają wartości puste. Średnia z pięciu ocen, z których dwie nie zostały wpisane, policzy się z trzech i będzie wyższa, niż spodziewa się osoba licząca ręcznie. Różnica między COUNT(*) a COUNT(pole) to gotowa odpowiedź na pytanie o kompletność danych.

-- srednia liczona tak, jakby brak oceny znaczyl zero
SELECT Avg(Nz([Ocena]; 0)) AS Srednia_z_zerami FROM Uczniowie;   -- Access
SELECT AVG(COALESCE(Ocena, 0)) AS Srednia_z_zerami FROM Uczniowie;  -- standardowy SQL

Taka wersja jest potrzebna tylko wtedy, gdy polecenie mówi wprost, że brak wyniku traktujemy jak zero. Bez tego zostaw domyślne zachowanie, czyli pomijanie pustych pól — i przy okazji dopisz do wyniku COUNT(pole), żeby było widać, z ilu wartości liczyła się średnia.

Czego Access nie rozumie

Zapis COUNT(DISTINCT pole), znany z każdego kursu SQL, w Accessie nie działa — zapytanie zwróci komunikat o błędzie składni. Liczbę różnych wartości robi się tam w dwóch krokach: najpierw kwerenda z DISTINCT, potem policzenie jej wierszy. W jednym zapytaniu wygląda to tak:

SELECT COUNT(*) AS Liczba_miast
FROM (SELECT DISTINCT Miasto FROM Klienci) AS m;

6. Grupowanie po okresie: miesiące, kwartały, lata

Polecenie „podaj obrót w poszczególnych miesiącach” wygląda na proste, ale pole z pełną datą do grupowania się nie nadaje — każdy dzień to osobna grupa. Trzeba najpierw wyciągnąć z daty okres, a dopiero po nim grupować.

SELECT Year([Data]) AS Rok, Month([Data]) AS Miesiac, SUM(Wartosc) AS Obrot
FROM Zamowienia
GROUP BY Year([Data]), Month([Data])
ORDER BY Rok, Miesiac;
  • Grupuj po roku i miesiącu razem. Samo Month() zsumuje styczeń 2025 ze styczniem 2026.
  • Kwartał wyciągasz przez DatePart("q"; [Data]), dzień tygodnia przez Weekday().
  • Nazwa miesiąca z Format([Data]; "mmmm") wygląda ładniej, ale sortuje się alfabetycznie — do porządkowania i tak potrzebny jest numer.

7. Klasyczny pewniak: kto ma najwięcej

Najszybsza droga to dwa kroki: kwerenda licząca sumy, a potem kwerenda, która ją sortuje i bierze wierzchołek. Zapisana kwerenda jest źródłem danych tak samo jak tabela.

-- krok 1: zapisz jako Kwerenda_sumy
SELECT ID_klienta, SUM(Wartosc) AS Razem
FROM Zamowienia GROUP BY ID_klienta;

-- krok 2
SELECT TOP 1 k.Nazwisko, s.Razem
FROM Kwerenda_sumy AS s
INNER JOIN Klienci AS k ON k.ID = s.ID_klienta
ORDER BY s.Razem DESC;
Remis na szczycie

Przy identycznych sumach Access zwróci wszystkie takie rekordy, bo nie rozstrzyga remisów. Zwykle o to właśnie chodzi w poleceniu. Jeśli arkusz oczekuje dokładnie jednej osoby, dołóż drugie kryterium sortowania, na przykład alfabetyczne po nazwisku.

8. Szybka kontrola przed oddaniem

  • Liczba wierszy wyniku równa się liczbie grup, a nie liczbie rekordów.
  • Suma wszystkich grup zgadza się z sumą całej kolumny bez grupowania.
  • Nazwy kolumn są takie, jak w poleceniu.
  • Średnia zaokrąglona tam, gdzie arkusz tego wymaga — w zapytaniu, nie tylko w formatowaniu.
  • Kwerenda zapisana pod nazwą z polecenia, a wynik przepisany do pliku z odpowiedziami.
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ę!