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ń.
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;
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.
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 przezWeekday(). - 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;
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.
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ę!