Zadanie 8
Matura z informatyki, maj 2026, poziom rozszerzony
Wymaganie: I.4) dobiera odpowiednią metodę lub technikę algorytmiczną i struktury danych. Wyszukiwanie i przetwarzanie informacji w relacyjnej bazie danych; zapytania SQL z łączeniem tabel.
Treść zadania
Zadanie 8. Sieć sklepów. Trzy pliki z danymi o sprzedaży (1.–3. dnia miesiąca, styczeń–czerwiec 2025, godz. 22:00–23:59), rozdzielone tabulatorami:
klienci.txt—IdKlienta,Imie,Nazwisko,Plec(K/M)transakcje.txt—IdTransakcji,DataTransakcji,IdKlienta,IdSklepu,IdSprzedawcy(puste przy kasie samoobsługowej)opis_transakcji.txt—IdTransakcji,IdProduktu,Cena,Liczba
8.1. (0–1) Imię i nazwisko klienta, który dokonał najwięcej transakcji.
8.2. (0–2) Ile kobiet i ilu mężczyzn nie kupiło niczego w całym okresie.
8.3. (0–2) Liczba różnych sklepów z transakcjami w kasach samoobsługowych oraz łączna kwota zapłacona w tych kasach.
8.4. (0–2) IdSprzedawcy, który obsługiwał klientów w największej liczbie różnych sklepów w jednym miesiącu, oraz ten miesiąc.
8.5. (0–2) Dodano tabele Produkty (IdProduktu, IdKategorii, Nazwa, Opis) i Kategorie (IdKategorii, NazwaKategorii). Napisz zapytanie SQL wypisujące wszystkie zakupione produkty (IdProduktu, Nazwa) z kategorii spozywcze, których opis zawiera fragment do ekspresu kolbowego.
Źródło: arkusz CKE MINP-R0-100-2605. Otwórz oryginalny PDF
Rozwiązanie
8.1. Marcelino Kruk
8.2. K – 689 i M – 651
8.3. 28 sklepów, kwota 19 443,29
8.4. 14, styczeń — sprzedawca o IdSprzedawcy 14, w styczniu.
8.5. Przykładowe rozwiązanie z klucza CKE:
SELECT Produkty.IdProduktu, Nazwa
FROM Opis_transakcji
JOIN Produkty
ON Opis_transakcji.IdProduktu = Produkty.IdProduktu
JOIN Kategorie
ON Kategorie.IdKategorii = Produkty.IdKategorii
WHERE NazwaKategorii = 'spozywcze'
AND Opis LIKE '%do ekspresu kolbowego%';
8.2 — pytanie jest o klientów, których NIE MA w transakcjach. To różnica zbiorów, nie filtr po tabeli transakcji. Trzeba wziąć wszystkich z klienci.txt i odjąć tych, którzy wystąpili w transakcje.txt, a dopiero potem policzyć wg płci. Liczenie „klientów z zerową liczbą transakcji" wprost w tabeli transakcji da 0, bo tacy klienci w ogóle się w niej nie pojawiają.
8.3 — puste pole IdSprzedawcy oznacza kasę samoobsługową. Warunek to IdSprzedawcy IS NULL (albo pusty łańcuch po imporcie z pliku), a nie jakaś konkretna wartość. Kwotę trzeba policzyć jako SUM(Cena * Liczba) po złączeniu z opis_transakcji — nie samą SUM(Cena), bo klient kupował po kilka sztuk.
8.4 — „w największej liczbie RÓŻNYCH sklepów" wymaga COUNT(DISTINCT IdSklepu). Bez DISTINCT policzysz transakcje, nie sklepy, i wyjdzie inny sprzedawca. Grupowanie musi być po sprzedawcy i miesiącu naraz.
8.5 — słowo „zakupione" jest istotne. Zapytanie musi wychodzić od Opis_transakcji (albo tam dołączać), bo pytamy tylko o produkty, które faktycznie ktoś kupił. Sam JOIN tabel Produkty i Kategorie wypisałby cały katalog. Drugi wymóg to LIKE z procentami po obu stronach — fragment ma być zawarty w opisie, niekoniecznie na początku.
Treść zadania (CKE)
Model danych
klienci (IdKlienta, Imie, Nazwisko, Plec)
│ 1
│
│ n
transakcje (IdTransakcji, DataTransakcji, IdKlienta, IdSklepu, IdSprzedawcy)
│ 1
│
│ n
opis_transakcji (IdTransakcji, IdProduktu, Cena, Liczba)
Wartość transakcji to SUM(Cena * Liczba) po wierszach z opis_transakcji.
Zapytania do podpunktów 8.1–8.4
-- 8.1 klient z największą liczbą transakcji
SELECT k.Imie, k.Nazwisko, COUNT(*) AS ile
FROM transakcje t JOIN klienci k ON k.IdKlienta = t.IdKlienta
GROUP BY k.IdKlienta ORDER BY ile DESC LIMIT 1;
-- 8.2 klienci bez żadnej transakcji, wg płci
SELECT Plec, COUNT(*)
FROM klienci
WHERE IdKlienta NOT IN (SELECT IdKlienta FROM transakcje)
GROUP BY Plec;
-- 8.3 kasy samoobsługowe: liczba sklepów i łączna kwota
SELECT COUNT(DISTINCT t.IdSklepu), SUM(o.Cena * o.Liczba)
FROM transakcje t JOIN opis_transakcji o ON o.IdTransakcji = t.IdTransakcji
WHERE t.IdSprzedawcy IS NULL;
-- 8.4 sprzedawca w największej liczbie różnych sklepów w jednym miesiącu
SELECT IdSprzedawcy, MONTH(DataTransakcji) AS m,
COUNT(DISTINCT IdSklepu) AS sklepy
FROM transakcje
WHERE IdSprzedawcy IS NOT NULL
GROUP BY IdSprzedawcy, m
ORDER BY sklepy DESC LIMIT 1;
Trzy konstrukcje SQL, które to zadanie sprawdza
| Konstrukcja | Po co tutaj |
|---|---|
COUNT(DISTINCT …) | liczenie różnych sklepów, nie transakcji (8.3, 8.4) |
NOT IN / LEFT JOIN … IS NULL | klienci bez transakcji (8.2) |
LIKE '%fragment%' | dopasowanie fragmentu tekstu (8.5) |
Punktacja CKE
- 8.1. 1 pkt · 8.2. 2 pkt · 8.3. 2 pkt · 8.4. 2 pkt.
- 8.5. 2 pkt — 1 pkt za wybór pól i połączenie tabel, 1 pkt za warunki wyszukiwania.
- Razem: 9 pkt.
Rozumiesz, jak to rozwiązać?
Przećwicz podobne typy zadań w aplikacji
matury-online.pl ma tysiące zadań pogrupowanych po dziedzinach. Sprawdź, czy temat „bazy danych, SQL, JOIN, LIKE, analiza transakcji" zrobisz samodzielnie.
Otwórz matury-online.pl