{"id":"informatyka-2026-maj-matura-rozszerzona/zad/8","paper_id":"informatyka-2026-maj-matura-rozszerzona","number":"8","points":9,"ptype":"open","subject":"informatyka","category":"matura","year":2026,"month":"maj","level":"rozszerzona","text":"Zadanie 8. Sieć sklepów\nW trzech plikach tekstowych o nazwach klienci.txt, transakcje.txt,\nopis_transakcji.txt zapisano dane o sprzedaży towarów w pewnej sieci sklepów\nw porach wieczornych pierwszych dni miesiąca. Dane obejmują informacje od 1. do 3. dnia\nmiesiąca w miesiącach od stycznia do czerwca 2025 roku w godzinach od 22:00 do 23:59.\nPierwszy wiersz każdego z plików jest wierszem nagłówkowym, a dane w wierszach\nrozdzielono tabulatorami.\nPlik klienci.txt zawiera informacje na temat zarejestrowanych klientów sieci sklepów.\nW każdym wierszu zapisano:\nIdKlienta - unikatowy identyfikator klienta (liczba całkowita)\nImie\n- imię klienta (tekst do 20 znaków)\nNazwisko - nazwisko klienta (tekst do 20 znaków)\nPlec\n- płeć klienta (znak K lub M).\nPrzykład:\nIdKlienta Imie\nNazwisko\nPlec\n1\nZofia\nSawicka\nK\n2\nZuzanna\nChmiel\nK\n3\nHanna\nSokolowska\nK\nPlik transakcje.txt zawiera informacje o dokonanych transakcjach. W każdym wierszu\nzapisano:\nIdTransakcji\n- unikatowy identyfikator transakcji (uwaga: identyfikatory nie są\nnadane chronologicznie - nie są kolejnymi numerami transakcji)\nDataTransakcji - datę transakcji (dd.mm.rrrr)\nIdKlienta\n- identyfikator klienta, który dokonał transakcji\nIdSklepu\n- identyfikator sklepu, w którym dokonano transakcji\nIdSprzedawcy\n- identyfikator sprzedawcy, który obsługiwał klienta przy kasie;\njeśli klient korzystał z kasy samoobsługowej, pole jest puste\n(brak danych).\nPrzykład:\nIdTransakcji DataTransakcji\nIdKlienta IdSklepu IdSprzedawcy\n1\n01.01.2025\n1814\n12\n160\n2\n01.02.2025\n550\n4\n125\n3\n01.03.2025\n1408\n16\n65\n4\n01.04.2025\n1146\n14\n33\n5\n01.05.2025\n630\n9\n6\n01.06.2025\n1011\n12\n120\nPlik o nazwie opis_transakcji.txt zawiera informacje o produktach zakupionych\nw danej transakcji. W każdym wierszu zapisano:\nIdTransakcji - identyfikator transakcji (uwaga: identyfikatory mogą się powtarzać)\nIdProduktu\n- identyfikator zakupionego produktu\nCena\n- cena jednostkowa zakupionego produktu\nLiczba\n- liczba określająca, ile sztuk danego produktu zakupiono.\nMINP-R0_100\nPrzykład:\nIdTransakcji IdProduktu Cena\nLiczba\n485\n78\n5,66\n11\n104\n87\n7\n4\n104\n84\n2\n5\n246\n42\n7,0\n15\nZ wykorzystaniem danych zawartych w podanych plikach oraz dostępnych narzędzi\ninformatycznych podaj odpowiedzi do zadań 8.1.-8.4. Odpowiedzi zapisz w pliku\nwyniki8.txt, a każdą z nich poprzedź numerem odpowiedniego zadania.","answer":null,"answer_text":"0\n0","solution":"Odpowiedź: **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: ```sql 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%'; ```\n\nTreść zadania (CKE)\n\nModel danych\n\n```\nklienci (IdKlienta, Imie, Nazwisko, Plec)\n│ 1\n│\n│ n\ntransakcje (IdTransakcji, DataTransakcji, IdKlienta, IdSklepu, IdSprzedawcy)\n│ 1\n│\n│ n\nopis_transakcji (IdTransakcji, IdProduktu, Cena, Liczba)\n```\n\nWartość transakcji to SUM(Cena * Liczba) po wierszach z opis_transakcji.\n\nZapytania do podpunktów 8.1–8.4\n\n```sql\n-- 8.1 klient z największą liczbą transakcji\nSELECT k.Imie, k.Nazwisko, COUNT(*) AS ile\nFROM transakcje t JOIN klienci k ON k.IdKlienta = t.IdKlienta\nGROUP BY k.IdKlienta ORDER BY ile DESC LIMIT 1;\n\n-- 8.2 klienci bez żadnej transakcji, wg płci\nSELECT Plec, COUNT(*)\nFROM klienci\nWHERE IdKlienta NOT IN (SELECT IdKlienta FROM transakcje)\nGROUP BY Plec;\n\n-- 8.3 kasy samoobsługowe: liczba sklepów i łączna kwota\nSELECT COUNT(DISTINCT t.IdSklepu), SUM(o.Cena * o.Liczba)\nFROM transakcje t JOIN opis_transakcji o ON o.IdTransakcji = t.IdTransakcji\nWHERE t.IdSprzedawcy IS NULL;\n\n-- 8.4 sprzedawca w największej liczbie różnych sklepów w jednym miesiącu\nSELECT IdSprzedawcy, MONTH(DataTransakcji) AS m,\nCOUNT(DISTINCT IdSklepu) AS sklepy\nFROM transakcje\nWHERE IdSprzedawcy IS NOT NULL\nGROUP BY IdSprzedawcy, m\nORDER BY sklepy DESC LIMIT 1;\n```\n\nTrzy konstrukcje SQL, które to zadanie sprawdza\n\nKonstrukcja | Po co tutaj\nCOUNT(DISTINCT …) | liczenie różnych sklepów, nie transakcji (8.3, 8.4)\nNOT IN / LEFT JOIN … IS NULL | klienci bez transakcji (8.2)\nLIKE '%fragment%' | dopasowanie fragmentu tekstu (8.5)\n\nPunktacja CKE\n\n- 8.1. 1 pkt · 8.2. 2 pkt · 8.3. 2 pkt · 8.4. 2 pkt.\n- 8.5. 2 pkt — 1 pkt za wybór pól i połączenie tabel, 1 pkt za warunki wyszukiwania.\n- Razem: 9 pkt.\n\nTypowy błąd: **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.","image":"img/informatyka-2026-maj-matura-rozszerzona/zad-8.webp","solution_image":null,"topics":"bazy danych, SQL, JOIN, LIKE, analiza transakcji","page_from":18,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturaonline","text_source":"ocr","source_label":"Informatyka · Matura · maj 2026 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 8. Sieć sklepów<br>W trzech plikach tekstowych o nazwach klienci.txt, transakcje.txt,<br>opis_transakcji.txt zapisano dane o sprzedaży towarów w pewnej sieci sklepów<br>w porach wieczornych pierwszych dni miesiąca. Dane obejmują informacje od 1. do 3. dnia<br>miesiąca w miesiącach od stycznia do czerwca 2025 roku w godzinach od 22:00 do 23:59.<br>Pierwszy wiersz każdego z plików jest wierszem nagłówkowym, a dane w wierszach<br>rozdzielono tabulatorami.<br>Plik klienci.txt zawiera informacje na temat zarejestrowanych klientów sieci sklepów.<br>W każdym wierszu zapisano:<br>IdKlienta - unikatowy identyfikator klienta (liczba całkowita)<br>Imie</p>\n<ul><li>imię klienta (tekst do 20 znaków)</li></ul>\n<p>Nazwisko - nazwisko klienta (tekst do 20 znaków)<br>Plec</p>\n<ul><li>płeć klienta (znak K lub M).</li></ul>\n<p>Przykład:<br>IdKlienta Imie<br>Nazwisko<br>Plec<br>1<br>Zofia<br>Sawicka<br>K<br>2<br>Zuzanna<br>Chmiel<br>K<br>3<br>Hanna<br>Sokolowska<br>K<br>Plik transakcje.txt zawiera informacje o dokonanych transakcjach. W każdym wierszu<br>zapisano:<br>IdTransakcji</p>\n<ul><li>unikatowy identyfikator transakcji (uwaga: identyfikatory nie są</li></ul>\n<p>nadane chronologicznie - nie są kolejnymi numerami transakcji)<br>DataTransakcji - datę transakcji (dd.mm.rrrr)<br>IdKlienta</p>\n<ul><li>identyfikator klienta, który dokonał transakcji</li></ul>\n<p>IdSklepu</p>\n<ul><li>identyfikator sklepu, w którym dokonano transakcji</li></ul>\n<p>IdSprzedawcy</p>\n<ul><li>identyfikator sprzedawcy, który obsługiwał klienta przy kasie;</li></ul>\n<p>jeśli klient korzystał z kasy samoobsługowej, pole jest puste<br>(brak danych).<br>Przykład:<br>IdTransakcji DataTransakcji<br>IdKlienta IdSklepu IdSprzedawcy<br>1<br>01.01.2025<br>1814<br>12<br>160<br>2<br>01.02.2025<br>550<br>4<br>125<br>3<br>01.03.2025<br>1408<br>16<br>65<br>4<br>01.04.2025<br>1146<br>14<br>33<br>5<br>01.05.2025<br>630<br>9<br>6<br>01.06.2025<br>1011<br>12<br>120<br>Plik o nazwie opis_transakcji.txt zawiera informacje o produktach zakupionych<br>w danej transakcji. W każdym wierszu zapisano:<br>IdTransakcji - identyfikator transakcji (uwaga: identyfikatory mogą się powtarzać)<br>IdProduktu</p>\n<ul><li>identyfikator zakupionego produktu</li></ul>\n<p>Cena</p>\n<ul><li>cena jednostkowa zakupionego produktu</li></ul>\n<p>Liczba</p>\n<ul><li>liczba określająca, ile sztuk danego produktu zakupiono.</li></ul>\n<p>MINP-R0_100<br>Przykład:<br>IdTransakcji IdProduktu Cena<br>Liczba<br>485<br>78<br>5,66<br>11<br>104<br>87<br>7<br>4<br>104<br>84<br>2<br>5<br>246<br>42<br>7,0<br>15<br>Z wykorzystaniem danych zawartych w podanych plikach oraz dostępnych narzędzi<br>informatycznych podaj odpowiedzi do zadań 8.1.-8.4. Odpowiedzi zapisz w pliku<br>wyniki8.txt, a każdą z nich poprzedź numerem odpowiedniego zadania.</p>","answer_text_html":"<p>0<br>0</p>","solutions":[{"source":"maturaonline","label":"matura-online.pl","kind":"text","html":"<p>Odpowiedź: <strong>8.1.</strong> <strong>Marcelino Kruk</strong> <strong>8.2.</strong> <strong>K – 689 i M – 651</strong> <strong>8.3.</strong> <strong>28 sklepów</strong>, kwota <strong>19 443,29</strong> <strong>8.4.</strong> <strong>14, styczeń</strong> — sprzedawca o <code>IdSprzedawcy</code> 14, w styczniu. <strong>8.5.</strong> Przykładowe rozwiązanie z klucza CKE: ``<code>sql SELECT Produkty.IdProduktu, Nazwa FROM Opis_transakcji JOIN Produkty ON Opis_transakcji.IdProduktu = Produkty.IdProduktu JOIN Kategorie ON Kategorie.IdKategorii = Produkty.IdKategorii WHERE NazwaKategorii = &#x27;spozywcze&#x27; AND Opis LIKE &#x27;%do ekspresu kolbowego%&#x27;; </code>``</p>\n<p>Treść zadania (CKE)</p>\n<p>Model danych</p>\n<p>```<br>klienci (IdKlienta, Imie, Nazwisko, Plec)<br>│ 1<br>│<br>│ n<br>transakcje (IdTransakcji, DataTransakcji, IdKlienta, IdSklepu, IdSprzedawcy)<br>│ 1<br>│<br>│ n<br>opis_transakcji (IdTransakcji, IdProduktu, Cena, Liczba)<br>```</p>\n<p>Wartość transakcji to SUM(Cena * Liczba) po wierszach z opis_transakcji.</p>\n<p>Zapytania do podpunktów 8.1–8.4</p>\n<p>```sql<br>-- 8.1 klient z największą liczbą transakcji<br>SELECT k.Imie, k.Nazwisko, COUNT(*) AS ile<br>FROM transakcje t JOIN klienci k ON k.IdKlienta = t.IdKlienta<br>GROUP BY k.IdKlienta ORDER BY ile DESC LIMIT 1;</p>\n<p>-- 8.2 klienci bez żadnej transakcji, wg płci<br>SELECT Plec, COUNT(*)<br>FROM klienci<br>WHERE IdKlienta NOT IN (SELECT IdKlienta FROM transakcje)<br>GROUP BY Plec;</p>\n<p>-- 8.3 kasy samoobsługowe: liczba sklepów i łączna kwota<br>SELECT COUNT(DISTINCT t.IdSklepu), SUM(o.Cena * o.Liczba)<br>FROM transakcje t JOIN opis_transakcji o ON o.IdTransakcji = t.IdTransakcji<br>WHERE t.IdSprzedawcy IS NULL;</p>\n<p>-- 8.4 sprzedawca w największej liczbie różnych sklepów w jednym miesiącu<br>SELECT IdSprzedawcy, MONTH(DataTransakcji) AS m,<br>COUNT(DISTINCT IdSklepu) AS sklepy<br>FROM transakcje<br>WHERE IdSprzedawcy IS NOT NULL<br>GROUP BY IdSprzedawcy, m<br>ORDER BY sklepy DESC LIMIT 1;<br>```</p>\n<p>Trzy konstrukcje SQL, które to zadanie sprawdza</p>\n<p>Konstrukcja | Po co tutaj<br>COUNT(DISTINCT …) | liczenie różnych sklepów, nie transakcji (8.3, 8.4)<br>NOT IN / LEFT JOIN … IS NULL | klienci bez transakcji (8.2)<br>LIKE &#x27;%fragment%&#x27; | dopasowanie fragmentu tekstu (8.5)</p>\n<p>Punktacja CKE</p>\n<ul><li>8.1. 1 pkt · 8.2. 2 pkt · 8.3. 2 pkt · 8.4. 2 pkt.</li><li>8.5. 2 pkt — 1 pkt za wybór pól i połączenie tabel, 1 pkt za warunki wyszukiwania.</li><li>Razem: 9 pkt.</li></ul>\n<p>Typowy błąd: <strong>8.2 — pytanie jest o klientów, których NIE MA w transakcjach.</strong> To różnica zbiorów, nie filtr po tabeli transakcji. Trzeba wziąć wszystkich z <code>klienci.txt</code> i odjąć tych, którzy wystąpili w <code>transakcje.txt</code>, a dopiero potem policzyć wg płci. Liczenie „klientów z zerową liczbą transakcji&quot; wprost w tabeli transakcji da 0, bo tacy klienci w ogóle się w niej nie pojawiają. <strong>8.3 — puste pole <code>IdSprzedawcy</code> oznacza kasę samoobsługową.</strong> Warunek to <code>IdSprzedawcy IS NULL</code> (albo pusty łańcuch po imporcie z pliku), a nie jakaś konkretna wartość. Kwotę trzeba policzyć jako <code>SUM(Cena * Liczba)</code> po złączeniu z <code>opis_transakcji</code> — nie samą <code>SUM(Cena)</code>, bo klient kupował po kilka sztuk. <strong>8.4 — „w największej liczbie RÓŻNYCH sklepów&quot; wymaga <code>COUNT(DISTINCT IdSklepu)</code>.</strong> Bez <code>DISTINCT</code> policzysz transakcje, nie sklepy, i wyjdzie inny sprzedawca. Grupowanie musi być po <strong>sprzedawcy i miesiącu</strong> naraz. <strong>8.5 — słowo „zakupione&quot; jest istotne.</strong> Zapytanie musi wychodzić od <code>Opis_transakcji</code> (albo tam dołączać), bo pytamy tylko o produkty, które faktycznie ktoś kupił. Sam <code>JOIN</code> tabel <code>Produkty</code> i <code>Kategorie</code> wypisałby cały katalog. Drugi wymóg to <code>LIKE</code> z <strong>procentami po obu stronach</strong> — fragment ma być <em>zawarty</em> w opisie, niekoniecznie na początku.</p>"}]}