Sprawdź zawód
Lekcje kursu · Praca z danymi

Analityk danych — Praca z danymi

Sprzedaż sklepu w dwóch kanałach

Praca z danymi · Lekcja 4 z 9

SQL: wybierz i pogrupuj

SQL to język do zadawania pytań bazie danych. SELECT mówi, jakie kolumny chcesz zobaczyć. WHERE zostawia tylko pasujące wiersze. GROUP BY składa wiersze o tej samej dacie i kanale w jedną grupę. COUNT(*) liczy wiersze w każdej grupie, a ORDER BY ustala kolejność wyniku.

Przykład z pracy

Żeby zobaczyć liczbę opłaconych zamówień, wystarczy tabela „zamówienia”. W niej jedno zamówienie to jeden wiersz, więc COUNT(*) liczy właśnie zamówienia.

Chcesz uruchomić kod? Pobierz dane do PostgreSQL ↓. W osobnej, pustej bazie wykonaj plik startowy, a potem poniższe zapytanie. Możesz też od razu przejrzeć wynik.

SQL
SELECT data, kanal, COUNT(*) AS liczba_zamowien
FROM zamowienia
WHERE status = 'opłacone'
GROUP BY data, kanal
ORDER BY data, kanal;
Opłacone zamówienia według dnia i kanału
datakanalliczba_zamowien
10 listopadaOnline1
10 listopadaSklep1
11 listopadaOnline1
11 listopadaSklep1

Ćwiczenie praktyczne

Otwórz przykład SQL. Usuń „kanal” z SELECT, GROUP BY i ORDER BY. Opisz, jak zmienia się znaczenie jednego wiersza wyniku.

Sprzedaż sklepu w dwóch kanałach

Podejmij decyzję

Wróć do notatki z początku sprawy. Zapisz pierwsze działanie i wyjaśnij, jak pomoże rozwiązać sytuację.

Pokaż przykładową reakcję

Sprawdź status i numer zamówienia, a wartość policz z pozycji produktów. Każda pozycja wnosi własną wartość, a liczba zamówień pozostaje niezależna od liczby produktów.

Sprawdź się — opcjonalne pytanie

Gdzie wpiszesz warunek „tylko opłacone zamówienia”?

  • W WHERE
  • W GROUP BY
  • W ORDER BY
Pokaż odpowiedź i wyjaśnienie

W WHERE. WHERE filtruje wiersze przed grupowaniem.

Praca z danymi · Lekcja 5 z 9

SQL: połącz dwie tabele

Żeby pokazać datę i kanał przy każdym produkcie, potrzebujesz obu tabel. Użyj JOIN i wskaż po ON, że numer zamówienia ma być taki sam po obu stronach. Litery z i p to skróty nazw tabel. INNER JOIN pokazuje tylko dopasowania. LEFT JOIN zostawia też wszystkie zamówienia z lewej tabeli, nawet jeśli po prawej nie ma pozycji.

Przykład z pracy

Dla 101 zobaczysz dwa wiersze: po jednym dla notesu i długopisu. Przy LEFT JOIN zobaczysz też 104 i 106, z pustym polem produktu, bo w tym zestawie nie mają pozycji.

zamowienia · jeden wiersz na zamówienie
id_zamowieniadatakanalstatus
10110 listopadaSklepopłacone
10210 listopadaOnlineopłacone
10311 listopadaOnlineopłacone
10411 listopadaOnlineanulowane
10511 listopadaSklepopłacone
10611 listopadaOnlineoczekuje
pozycje_zamowien · jeden wiersz na pozycję
id_pozycjiid_zamowieniaproduktilosccena
1101Notes230 zł
2101Długopis120 zł
3102Kubek170 zł
4103Notes130 zł
5103Kubek170 zł
6105Długopis220 zł
zamowieniaid_zamowienia · 1pozycje_zamowienid_zamowienia · wiele
INNER JOIN — tylko pasujące wiersze
SQL
SELECT z.id_zamowienia, z.data, z.kanal,
       p.produkt, p.ilosc, p.cena
FROM zamowienia AS z
INNER JOIN pozycje_zamowien AS p
  ON z.id_zamowienia = p.id_zamowienia
ORDER BY z.id_zamowienia, p.id_pozycji;
Wynik: 6 wierszy
id_zamowieniadatakanalproduktilosccena
10110 listopadaSklepNotes230 zł
10110 listopadaSklepDługopis120 zł
10210 listopadaOnlineKubek170 zł
10311 listopadaOnlineNotes130 zł
10311 listopadaOnlineKubek170 zł
10511 listopadaSklepDługopis220 zł
LEFT JOIN — także zamówienia bez pozycji
SQL
SELECT z.id_zamowienia, z.data, z.kanal,
       p.produkt, p.ilosc, p.cena
FROM zamowienia AS z
LEFT JOIN pozycje_zamowien AS p
  ON z.id_zamowienia = p.id_zamowienia
ORDER BY z.id_zamowienia, p.id_pozycji;
Wynik: 8 wierszy
id_zamowieniadatakanalproduktilosccena
10110 listopadaSklepNotes230 zł
10110 listopadaSklepDługopis120 zł
10210 listopadaOnlineKubek170 zł
10311 listopadaOnlineNotes130 zł
10311 listopadaOnlineKubek170 zł
10411 listopadaOnlineNULLNULLNULL
10511 listopadaSklepDługopis220 zł
10611 listopadaOnlineNULLNULLNULL

Ćwiczenie praktyczne

Otwórz oba wyniki złączenia. Znajdź 101 oraz 104 i powiedz, skąd bierze się różnica między tymi dwoma przypadkami.

Sprawdź się — opcjonalne pytanie

Które złączenie pokaże wszystkie zamówienia, także te bez produktów w tabeli pozycji?

  • INNER JOIN
  • LEFT JOIN, z zamówieniami po lewej stronie
  • Wystarczy ORDER BY
Pokaż odpowiedź i wyjaśnienie

LEFT JOIN, z zamówieniami po lewej stronie. LEFT JOIN zachowuje wiersze z lewej tabeli. Brakujące kolumny z prawej strony mają wartość NULL.

Praca z danymi · Lekcja 6 z 9

Sprawdź sumę po złączeniu

Po złączeniu jeden wiersz wyniku oznacza pozycję, nie całe zamówienie. Wartość pozycji to ilość razy cena. Sumujemy te wartości po odfiltrowaniu nieopłaconych zamówień. Jeśli raport ma też pokazać liczbę zamówień, użyj COUNT(DISTINCT numer_zamówienia), czyli policz każdy numer tylko raz.

Przykład z pracy

Zamówienie 101 ma dwie pozycje za 60 i 20 zł. Ich suma to 80 zł. Gdyby kwota 80 zł była zapisana przy zamówieniu i powieliła się obok obu produktów, jej prosta suma błędnie dałaby 160 zł.

SQL
SELECT z.data, z.kanal,
       SUM(p.ilosc * p.cena) AS sprzedaz_zl,
       COUNT(DISTINCT z.id_zamowienia) AS liczba_zamowien
FROM zamowienia AS z
INNER JOIN pozycje_zamowien AS p
  ON z.id_zamowienia = p.id_zamowienia
WHERE z.status = 'opłacone'
GROUP BY z.data, z.kanal
ORDER BY z.data, z.kanal;
Sprzedaż i liczba opłaconych zamówień
datakanalsprzedaz_zlliczba_zamowien
10 listopadaOnline70 zł1
10 listopadaSklep80 zł1
11 listopadaOnline100 zł1
11 listopadaSklep40 zł1
RazemWszystkie290 zł4

Ćwiczenie praktyczne

Porównaj raport SQL z tabelą przestawną z lekcji 3. Gdy kwoty są różne, sprawdź najpierw statusy, potem poziom wiersza i sposób sumowania.

Sprawdź się — opcjonalne pytanie

Dlaczego COUNT(*) po złączeniu może zawyżyć liczbę zamówień?

  • Bo jedno zamówienie może pojawić się przy kilku pozycjach
  • Bo data jest zapisana tekstem
  • Bo ORDER BY dodaje wiersze
Pokaż odpowiedź i wyjaśnienie

Bo jedno zamówienie może pojawić się przy kilku pozycjach. COUNT(*) widzi wszystkie wiersze wyniku, czyli w tym przypadku pozycje. DISTINCT pozwala policzyć każdy numer zamówienia raz.