SQL Server dla początkujących – jak pisać zapytania SQL i analizować dane z baz?
Naucz się pisać zapytania SQL w SQL Server na przykładzie danych sprzedażowych. Poznaj SELECT, filtrowanie, grupowanie i agregacje, a następnie wykorzystaj je do analizy klientów i produktów. W nauce pomoże Ci plan ćwiczeń na 2 tygodnie.
Wprowadzenie: czym jest SQL Server i do czego służy SQL w analizie danych
Dane o zamówieniach, płatnościach czy stanach magazynowych same w sobie nie wyjaśniają, co dzieje się w biznesie. Do analizy potrzebny jest sposób na wybranie istotnych informacji, połączenie ich i wykonanie obliczeń. W pracy z relacyjnymi bazami danych służy do tego SQL, a jednym z systemów, w których można go używać, jest Microsoft SQL Server.
SQL Server to system zarządzania relacyjnymi bazami danych rozwijany przez Microsoft. Odpowiada za przechowywanie i udostępnianie danych, obsługę ich zmian oraz kontrolę dostępu. Może stanowić zaplecze aplikacji, systemu sprzedażowego lub rozwiązania raportowego. Jego zadaniem jest nie tylko umożliwienie odczytu informacji, lecz także dbanie o ich spójność podczas równoczesnej pracy wielu użytkowników i aplikacji.
SQL Server i SQL nie oznaczają tego samego. Pierwszy jest konkretnym systemem bazodanowym, drugi — językiem służącym do pracy z danymi. SQL jest wykorzystywany również w innych systemach, choć szczegóły składni mogą się między nimi różnić. W SQL Server używa się odmiany tego języka nazywanej Transact-SQL, w skrócie T-SQL.
W analizie danych SQL pozwala określić, jakiego wyniku potrzebujesz: które informacje uwzględnić, jakie warunki mają spełniać i w jaki sposób je zestawić. System bazodanowy dobiera sposób wykonania takiego zapytania. Dzięki temu można analizować wybrany okres, porównywać grupy danych lub przygotowywać zbiorcze wyniki bez ręcznego przeglądania wszystkich zapisów.
Istotną zaletą jest powtarzalność pracy. Zapisane zapytanie można uruchomić ponownie na zaktualizowanych danych, zachowując te same reguły analizy. Wynik może następnie trafić do arkusza kalkulacyjnego, raportu lub narzędzia wizualizacyjnego. SQL nie zastępuje jednak interpretacji: poprawnie wykonane obliczenie będzie użyteczne dopiero wtedy, gdy odpowiada właściwemu pytaniu i opiera się na odpowiednio dobranych danych.
SQL Server vs SSMS i Azure Data Studio — silnik bazy danych a narzędzia pracy
SQL Server wykonuje zapytania, a SSMS i Azure Data Studio pozwalają je pisać, wysyłać do serwera oraz przeglądać wyniki. To podstawowa różnica: silnik bazy danych odpowiada za przetwarzanie i przechowywanie danych, natomiast aplikacja kliencka zapewnia interfejs do pracy z nimi. Zainstalowanie samego edytora nie oznacza więc, że na komputerze działa już SQL Server. W Cognity często spotykamy się z pytaniami o tę różnicę podczas szkoleń, dlatego wyjaśniamy ją również na blogu.
Za co odpowiada każde z tych rozwiązań?
- SQL Server — silnik, który obsługuje bazy danych, wykonuje zapytania i kontroluje dostęp do informacji. Może działać na Twoim komputerze albo na osobnym serwerze, z którym łączysz się przez sieć.
- SQL Server Management Studio (SSMS) — aplikacja dla systemu Windows, przeznaczona do pracy z SQL Server. Umożliwia pisanie zapytań, oglądanie wyników i przeglądanie obiektów bazy, a administratorom udostępnia rozbudowane funkcje zarządzania serwerem.
- Azure Data Studio — wieloplatformowe narzędzie używane do pisania zapytań i pracy analitycznej, dostępne na Windows, macOS i Linux. Mimo nazwy nie wymagało korzystania z chmury Azure: pozwalało również łączyć się z lokalnym SQL Server.
Ważna uwaga dotycząca Azure Data Studio: Microsoft wyznaczył koniec jego wsparcia na 28 lutego 2026 r. Jako rozwiązanie zastępcze wskazuje Visual Studio Code z rozszerzeniem MSSQL. Jeśli korzystasz ze starszych poradników, możesz nadal spotykać instrukcje oparte na Azure Data Studio, ale do nowego środowiska nauki warto wybrać narzędzie objęte wsparciem.
Co wybrać na początek?
Jeśli pracujesz w Windows i uczysz się SQL Server, SSMS będzie praktycznym wyborem. Potrzebujesz jednak także dostępu do działającej instancji SQL Server — lokalnej lub zdalnej. Przy połączeniu wskazujesz serwer, sposób uwierzytelniania i bazę, na której chcesz pracować. Dostępne operacje zależą od uprawnień Twojego konta, nie od samego edytora.
Na macOS lub Linux możesz używać Visual Studio Code z rozszerzeniem MSSQL i łączyć się z dostępnym serwerem. Niezależnie od aplikacji schemat pracy pozostaje taki sam: wpisujesz zapytanie, narzędzie przekazuje je do silnika, a następnie wyświetla otrzymane wyniki. Zamknięcie edytora nie usuwa bazy ani nie zatrzymuje automatycznie serwera.
Podstawowe pojęcia relacyjnych baz danych: tabela, rekord, kolumna, klucze i relacje
Aby poprawnie analizować dane, trzeba wiedzieć, co oznacza pojedynczy wiersz i jak łączy się z informacjami w innych tabelach. To ważniejsze, niż może się wydawać: wiersz opisujący całe zamówienie ma inne znaczenie niż wiersz opisujący jeden z zamówionych produktów. Pomylenie tych poziomów szczegółowości może prowadzić do błędnych obliczeń.
Tabela, rekord i kolumna — jak są uporządkowane dane?
Tabela przechowuje dane dotyczące określonego rodzaju obiektów lub zdarzeń, na przykład klientów, produktów albo zamówień. Przypomina arkusz z wierszami i kolumnami, ale ma zdefiniowaną strukturę oraz reguły określające, jakie dane można w niej zapisać.
Rekord, czyli wiersz tabeli, opisuje pojedynczy obiekt lub zdarzenie. W tabeli klientów jeden rekord może odpowiadać jednemu klientowi, a w tabeli zamówień — jednemu zamówieniu. Warto zawsze ustalić tę zasadę przed rozpoczęciem analizy.
Kolumna opisuje konkretną cechę, na przykład identyfikator klienta, datę zamówienia lub cenę produktu. Ma nazwę i typ danych, który określa sposób przechowywania wartości: jako liczby, tekst, daty czy inne obsługiwane rodzaje danych. Typ wpływa również na to, jakie operacje można na tych wartościach wykonywać.
Niektóre kolumny dopuszczają NULL, czyli brak wartości. NULL nie oznacza zera ani pustego tekstu — może wskazywać na informację nieznaną lub nieuzupełnioną. To rozróżnienie ma znaczenie podczas filtrowania danych i wykonywania obliczeń.
Klucz główny (PK) — jednoznaczna identyfikacja rekordu
Klucz główny, oznaczany skrótem PK od Primary Key, pozwala jednoznacznie wskazać każdy rekord w tabeli. Może nim być na przykład kolumna KlientID. Wartości klucza głównego nie mogą się powtarzać ani przyjmować NULL.
Tabela może mieć jeden klucz główny, ale może on obejmować kilka kolumn. W takim przypadku unikalna musi być ich kombinacja, a niekoniecznie każda wartość osobno. Klucz główny nie musi być numerem generowanym automatycznie — identyfikowanie rekordów i automatyczne nadawanie numerów to odrębne mechanizmy.
Klucz obcy (FK) — powiązanie między tabelami
Klucz obcy, czyli FK od Foreign Key, wskazuje powiązany rekord, najczęściej przez odwołanie do klucza głównego innej tabeli. Przykładowo kolumna KlientID w tabeli zamówień pozwala ustalić, do którego klienta należy zamówienie.
Ta sama wartość klucza obcego może występować wielokrotnie: jeden klient może przecież złożyć wiele zamówień. Zdefiniowane ograniczenie FK pilnuje spójności danych — nie pozwala przypisać zamówienia do identyfikatora klienta, którego nie ma w tabeli klientów. Sama zgodność nazw kolumn nie tworzy takiego zabezpieczenia.
Relacje — jak dane łączą się ze sobą?
Relacja opisuje sposób powiązania rekordów. Najczęściej spotkasz trzy warianty:
- Jeden do wielu: jeden klient może mieć wiele zamówień, a każde zamówienie należy do jednego klienta.
- Jeden do jednego: rekord ma najwyżej jeden odpowiednik w drugiej tabeli, na przykład klient może mieć jeden rekord z dodatkowymi ustawieniami.
- Wiele do wielu: jedno zamówienie może obejmować wiele produktów, a jeden produkt może występować w wielu zamówieniach. Takie powiązanie odwzorowuje się przez tabelę pośrednią, na przykład pozycje zamówień.
Rozpoznanie rodzaju relacji pomaga uniknąć błędów analitycznych. Po powiązaniu zamówienia z jego pozycjami informacje o tym zamówieniu mogą pojawić się w kilku wierszach. Nie oznacza to kilku różnych zamówień — dlatego przed liczeniem rekordów lub sumowaniem kwot trzeba sprawdzić, co dokładnie reprezentuje wynik.
Mini-zbiór danych: sprzedaż, klienci i produkty do ćwiczeń
Do nauki zapytań wykorzystamy niewielki, fikcyjny zbiór danych sprzedażowych: czterech klientów, cztery produkty i cztery zamówienia. Taki zakres pozwala samodzielnie sprawdzić wyniki obliczeń, a jednocześnie wystarcza do porównywania sprzedaży między miesiącami, analizowania zakupów klientów i wyszukiwania produktów bez zamówień.
Dane są podzielone na cztery tabele: Klienci, Produkty, Zamowienia oraz PozycjeZamowien. W nazwach tabel i kolumn celowo pomijamy polskie znaki, aby ułatwić wpisywanie identyfikatorów podczas ćwiczeń.
Klienci — kto składa zamówienia?
Tabela Klienci zawiera identyfikator klienta, jego miasto i segment. Do ćwiczeń nie potrzebujemy nazwisk ani danych kontaktowych — wystarczą informacje, według których można później porównywać wyniki sprzedaży.
| KlientID | Miasto | Segment |
|---|---|---|
| 1 | Warszawa | Detaliczny |
| 2 | Kraków | Biznesowy |
| 3 | Warszawa | Biznesowy |
| 4 | Gdańsk | Detaliczny |
Produkty — co znajduje się w ofercie?
Tabela Produkty opisuje asortyment i jego bieżące ceny. Kategorie pozwalają analizować nie tylko pojedyncze produkty, lecz także całe grupy towarów. Wszystkie kwoty w zbiorze są wyrażone w PLN.
| ProduktID | NazwaProduktu | Kategoria | CenaKatalogowa |
|---|---|---|---|
| 1 | Klawiatura | Akcesoria komputerowe | 120.00 |
| 2 | Mysz | Akcesoria komputerowe | 80.00 |
| 3 | Słuchawki | Audio | 150.00 |
| 4 | Podkładka | Akcesoria komputerowe | 35.00 |
Zamówienia — kiedy i przez kogo zostały złożone?
W tabeli Zamowienia zapisujemy datę, klienta i status każdego zamówienia. Kolumna KlientID wskazuje klienta z pierwszej tabeli. Nie umieszczamy tutaj listy produktów: jedno zamówienie może obejmować kilka różnych towarów, dlatego jego zawartość zapisujemy osobno.
| ZamowienieID | KlientID | DataZamowienia | Status |
|---|---|---|---|
| 101 | 1 | 2025-01-10 | Zrealizowane |
| 102 | 2 | 2025-01-12 | Zrealizowane |
| 103 | 1 | 2025-02-03 | Zrealizowane |
| 104 | 3 | 2025-02-05 | Anulowane |
Pozycje zamówień — jakie produkty i w jakiej ilości kupiono?
Tabela PozycjeZamowien zawiera sześć pozycji przypisanych do czterech zamówień. Każda pozycja wskazuje produkt, liczbę sztuk i cenę jednostkową ustaloną przy zakupie. CenaJednostkowa nie musi być równa aktualnej cenie katalogowej — różnica może wynikać na przykład z rabatu lub późniejszej zmiany cennika.
| PozycjaID | ZamowienieID | ProduktID | Ilosc | CenaJednostkowa |
|---|---|---|---|---|
| 1 | 101 | 1 | 1 | 110.00 |
| 2 | 101 | 2 | 2 | 80.00 |
| 3 | 102 | 3 | 2 | 150.00 |
| 4 | 103 | 1 | 1 | 120.00 |
| 5 | 103 | 3 | 1 | 150.00 |
| 6 | 104 | 2 | 3 | 80.00 |
Założenia potrzebne do poprawnej analizy
W tym zbiorze wartość pozycji to ilość pomnożona przez cenę jednostkową z zamówienia, nie przez cenę katalogową produktu. Dla uproszczenia pomijamy VAT, koszty dostawy i zwroty. Za sprzedaż uznajemy wyłącznie zamówienia ze statusem Zrealizowane, a do porównań miesięcznych używamy daty zamówienia.
Zwróć uwagę na celowo uwzględnione przypadki: klient o identyfikatorze 1 zamawia dwukrotnie, klient 4 nie ma żadnego zamówienia, a produkt 4 nie występuje w żadnej pozycji. Zamówienie 104 jest anulowane, choć jego zawartość pozostaje w bazie. Dzięki temu ćwiczenia obejmują także sytuacje, w których sama obecność danych nie oznacza dokonanej sprzedaży. W Cognity omawiamy zasady analizy danych zarówno od strony technicznej, jak i praktycznej — zgodnie z realiami pracy uczestników.
Jeśli odtwarzasz ten zbiór w SQL Server, dla identyfikatorów i ilości zastosuj typ int, dla daty date, dla kwot decimal(10,2), a dla tekstów nvarchar o odpowiedniej długości. Zachowaj podane nazwy tabel i kolumn — ułatwi to pracę na wspólnym zestawie danych.
Podstawy SELECT: SELECT, WHERE, ORDER BY, DISTINCT, TOP — pierwsze zapytania na danych
Pierwsze zapytanie nie musi być rozbudowane, aby dać użyteczny wynik. Wystarczy określić, które dane chcesz zobaczyć, jakie warunki mają spełniać i w jakiej kolejności mają się pojawić. Do tego służą instrukcja SELECT oraz uzupełniające ją elementy zapytania. Poniższe przykłady zakładają, że dostępna jest tabela Sprzedaz z kolumnami IdSprzedazy, DataSprzedazy, Produkt i Kwota.
SELECT — wybierz kolumny do wyświetlenia
Po SELECT wpisujesz nazwy potrzebnych kolumn, a po FROM wskazujesz tabelę, z której mają pochodzić dane. Zwykłe zapytanie tego typu odczytuje dane — nie zmienia zawartości tabeli.
SELECT DataSprzedazy, Produkt, Kwota
FROM Sprzedaz;Wynik zawiera wybrane kolumny dla wszystkich wierszy tabeli. Możesz też użyć SELECT *, aby pobrać wszystkie kolumny, ale przy regularnej pracy lepiej wymieniać je jawnie. Dzięki temu wynik jest czytelniejszy i nie pobierasz niepotrzebnych danych. Samo SELECT nie gwarantuje kolejności wierszy, nawet jeśli kolejne uruchomienia pokazują je w podobnym układzie.
WHERE — pozostaw tylko wiersze spełniające warunek
Klauzula WHERE ogranicza wynik do danych, które odpowiadają podanym kryteriom. Możesz w ten sposób wybrać określony okres, produkt albo zakres kwot. Poniższe zapytanie zwraca sprzedaż ze stycznia 2025 roku z kwotą wynoszącą co najmniej 100.
SELECT DataSprzedazy, Produkt, Kwota
FROM Sprzedaz
WHERE DataSprzedazy >= '20250101'
AND DataSprzedazy < '20250201'
AND Kwota >= 100;Operator AND oznacza, że wszystkie połączone nim warunki muszą być spełnione. Z kolei OR pozwala dopuścić spełnienie przynajmniej jednego z warunków. Przy ich łączeniu warto stosować nawiasy, aby jednoznacznie zapisać zamierzoną logikę.
Zakres dat zapisany jako „od początku miesiąca włącznie do początku następnego miesiąca wyłącznie” działa również wtedy, gdy kolumna przechowuje godzinę. Pozwala uniknąć przypadkowego pominięcia części danych z ostatniego dnia miesiąca. Pamiętaj też, że brak wartości sprawdza się przez IS NULL, a nie = NULL.
ORDER BY — uporządkuj wynik
ORDER BY sortuje zwracane wiersze. Kierunek ASC oznacza kolejność rosnącą i jest domyślny, natomiast DESC — malejącą. Aby zobaczyć najwyższe kwoty na początku wyniku, użyj:
SELECT IdSprzedazy, Produkt, Kwota
FROM Sprzedaz
ORDER BY Kwota DESC, IdSprzedazy ASC;Druga kolumna rozstrzyga kolejność wierszy o takiej samej kwocie. Jeżeli IdSprzedazy jest unikalne, taki zapis zapewnia jednoznaczne uporządkowanie wyniku. Sortowanie nie zmienia kolejności przechowywania danych w tabeli.
DISTINCT — usuń powtórzenia z wyniku
Jeśli potrzebujesz listy produktów występujących w sprzedaży, a nie każdego wiersza sprzedaży osobno, zastosuj DISTINCT:
SELECT DISTINCT Produkt
FROM Sprzedaz
ORDER BY Produkt;Każda odrębna wartość produktu pojawi się w wyniku tylko raz. DISTINCT dotyczy całego zestawu wybranych kolumn: dla SELECT DISTINCT Produkt, Kwota otrzymasz unikalne pary produktu i kwoty, niekoniecznie po jednym wierszu na produkt. Ten element zapytania nie usuwa żadnych danych z tabeli.
TOP — ogranicz liczbę zwracanych wierszy
W SQL Server zapis TOP (5) ogranicza wynik do najwyżej pięciu wierszy. W połączeniu z filtrowaniem i sortowaniem pozwala wyświetlić na przykład pięć pozycji o najwyższych kwotach spośród tych, które spełniają wskazany warunek:
SELECT TOP (5) IdSprzedazy, Produkt, Kwota
FROM Sprzedaz
WHERE Kwota >= 100
ORDER BY Kwota DESC, IdSprzedazy ASC;TOP bez ORDER BY nie oznacza ani najnowszych, ani największych wartości — nie określa, które wiersze mają zostać wybrane. W tym przykładzie WHERE wyznacza pasujące dane, ORDER BY ustala ich kolejność, a TOP ogranicza liczbę zwróconych pozycji. Te elementy pełnią różne funkcje i można je łączyć w jednym zapytaniu.
Agregacje i grupowanie: COUNT, SUM, AVG, GROUP BY oraz filtrowanie wyników HAVING
Lista pojedynczych transakcji pokazuje szczegóły sprzedaży, ale nie odpowiada od razu na pytania o jej skalę. Ile pozycji sprzedaży zarejestrowano? Jaka była ich łączna wartość? Ile średnio wynosiła wartość jednej pozycji? Funkcje agregujące przekształcają wiele wierszy w zbiorczy wynik. W połączeniu z GROUP BY pozwalają obliczać takie wartości osobno dla każdej kategorii, klienta czy okresu.
COUNT, SUM i AVG — co obliczają?
| Funkcja | Działanie | Na co zwrócić uwagę? |
|---|---|---|
COUNT(*) | Zlicza wszystkie wiersze uwzględnione w obliczeniu. | Liczy wiersze także wtedy, gdy niektóre kolumny zawierają NULL. |
COUNT(kolumna) | Zlicza niepuste wartości wskazanej kolumny. | Pomija NULL, ale uwzględnia zera i puste ciągi znaków. |
SUM(kolumna) | Sumuje wartości liczbowe. | Może sumować również wynik wyrażenia, np. ilość pomnożoną przez cenę. |
AVG(kolumna) | Oblicza średnią arytmetyczną wartości liczbowych. | Pomija NULL zarówno w sumie, jak i w liczbie wartości użytej do obliczenia średniej. |
Brak wartości nie oznacza zera. Dla wartości 100, 200 i NULL funkcja AVG zwróci 150. Dla 100, 200 i 0 wynikiem będzie 100. Funkcja SUM również pomija NULL. Ta różnica ma znaczenie wszędzie tam, gdzie niekompletne dane mogłyby zaniżyć lub zawyżyć interpretowany wynik.
W SQL Server warto też sprawdzać typ danych: AVG dla kolumny typu int zwraca wynik całkowity, bez części ułamkowej. Jeśli potrzebujesz dokładniejszej średniej, możesz użyć np. AVG(CAST(Ilosc AS decimal(18,2))).
GROUP BY — jeden wynik dla każdej grupy
Bez GROUP BY agregacja obejmuje wszystkie wiersze, które przeszły filtrowanie. Po dodaniu GROUP BY Kategoria SQL Server tworzy osobną grupę dla każdej kategorii i oblicza agregaty niezależnie w każdej z nich. Wynikiem jest więc jeden wiersz na kategorię, a nie jeden wiersz na pozycję sprzedaży.
W prostym zapytaniu grupującym każda kolumna wyświetlana w SELECT, która nie jest objęta funkcją agregującą, musi znaleźć się w GROUP BY. Dodanie kolejnej kolumny do grupowania zwiększa szczegółowość wyniku: grupowanie po kategorii i miesiącu daje osobny wynik dla każdej występującej pary tych wartości.
WHERE a HAVING — filtrowanie wierszy i grup
WHERE wybiera wiersze przed agregacją, a HAVING filtruje grupy po obliczeniu agregatów. Pierwszej klauzuli użyjesz, aby ograniczyć analizę do wskazanego okresu. Drugiej — aby pozostawić tylko kategorie, których łączna sprzedaż przekroczyła ustalony próg.
Dla ilustracji przyjmijmy tabelę Sprzedaz z kolumnami Kategoria, DataSprzedazy i WartoscPozycji, gdzie każdy wiersz oznacza jedną pozycję sprzedaży, a jej wartość ma typ decimal:
SELECT
Kategoria,
COUNT(*) AS LiczbaPozycji,
SUM(WartoscPozycji) AS LacznaWartosc,
AVG(WartoscPozycji) AS SredniaWartoscPozycji
FROM Sprzedaz
WHERE DataSprzedazy >= '20250101'
AND DataSprzedazy < '20260101'
GROUP BY Kategoria
HAVING SUM(WartoscPozycji) >= 10000;
Zapytanie uwzględnia pozycje z 2025 roku, grupuje je według kategorii i pozostawia tylko grupy o łącznej wartości co najmniej 10 000. Warunku dotyczącego sumy nie można przenieść do WHERE na tym samym poziomie zapytania — na etapie filtrowania pojedynczych wierszy wynik agregacji nie jest jeszcze dostępny.
Przy interpretacji wyniku pilnuj jednostki analizy: tutaj COUNT(*) oznacza liczbę pozycji sprzedaży, nie zamówień, a AVG(WartoscPozycji) — średnią wartość pozycji, nie całego koszyka. Poprawna składnia nie wystarczy, jeśli obliczana miara nie odpowiada temu, co chcesz zmierzyć.
Przykłady biznesowe: jakie pytania o sprzedaż, klientów i produkty można rozwiązać za pomocą SQL?
Zapytanie analityczne zaczyna się od pytania biznesowego, nie od wyboru polecenia SQL. „Które produkty sprzedają się najlepiej?” brzmi konkretnie, ale może oznaczać ranking według liczby sztuk, wartości sprzedaży albo marży. Każdy z tych wariantów wymaga innego sposobu obliczeń. Poniższe przykłady pokazują, jak przełożyć potrzeby biznesowe na założenia zapytań w SQL Server.
Jak zmieniała się wartość sprzedaży w kolejnych miesiącach?
Takie zapytanie powinno zestawiać miesiące z łączną wartością sprzedaży w każdym z nich. Jeśli dane obejmują pozycje zamówień, podstawą obliczeń może być ilość pomnożona przez cenę jednostkową, z uwzględnieniem sposobu zapisu rabatów. Do analizy historycznej potrzebna jest cena obowiązująca przy transakcji, a nie aktualna cena z katalogu produktów.
Przed porównaniem okresów ustal, które transakcje uwzględniasz: złożone, opłacone czy zrealizowane. Zdecyduj też, jak traktujesz anulowania i zwroty. Wynik pozwala zauważyć wzrosty, spadki oraz możliwą sezonowość, ale sam nie wyjaśnia ich przyczyn. Nie porównuj również niepełnego bieżącego miesiąca z pełnym poprzednim bez wyraźnego zaznaczenia tej różnicy.
Którzy klienci odpowiadają za największą wartość sprzedaży?
Założeniem zapytania jest zebranie transakcji każdego klienta z wybranego okresu, obliczenie ich łącznej wartości i uporządkowanie wyników od najwyższej kwoty. Warto dołączyć liczbę zamówień: podobny wynik finansowy może pochodzić z jednego dużego zakupu albo z wielu mniejszych.
Klientów należy rozróżniać po ich identyfikatorach, nie wyłącznie po nazwach, które mogą się powtarzać. Tak przygotowany ranking pomaga rozpoznać najważniejszych odbiorców i ocenić koncentrację sprzedaży. Wysoka wartość zakupów nie oznacza jednak automatycznie wysokiej rentowności klienta — do jej oceny potrzebne są również dane o kosztach.
Które produkty sprzedają się najlepiej?
Przygotuj dwa odrębne zestawienia: według liczby sprzedanych sztuk oraz według wartości sprzedaży. Pierwsze wspiera ocenę zapotrzebowania i planowanie zapasów, drugie pokazuje udział produktów w wartości transakcji. Tani produkt kupowany często może prowadzić w rankingu ilościowym, lecz pozostawać daleko za droższym produktem w rankingu wartościowym.
Oba zapytania powinny obejmować ten sam okres i te same zasady uwzględniania transakcji. Dzięki temu różnice między wynikami będą wynikały z wybranej miary, a nie z niespójnych filtrów.
Które produkty nie sprzedały się w wybranym okresie?
To pytanie wymaga uwzględnienia również produktów bez transakcji. Samo przeszukanie pozycji zamówień nie wystarczy — punktem odniesienia musi być lista produktów zestawiona ze sprzedażą w analizowanym przedziale czasu.
Wynik może pomóc wskazać asortyment wymagający przeglądu. Brak sprzedaży nie dowodzi jednak braku zainteresowania: produkt mógł być niedostępny lub dopiero wprowadzony do oferty. Do decyzji o wycofaniu potrzebny jest więc szerszy kontekst.
Jaka jest średnia wartość zamówienia?
Najpierw trzeba obliczyć wartość każdego zamówienia, a dopiero później średnią z tych wartości. Średnia wartość pozycji zamówienia nie jest średnią wartością całego zamówienia. To istotna różnica, ponieważ jeden zakup może obejmować kilka produktów.
Takie zapytanie pomaga porównywać wielkość koszyka między okresami lub grupami klientów. Przy sprawdzaniu wyniku zwróć uwagę, czy po połączeniu danych każde zamówienie jest liczone tylko raz. Wielokrotne uwzględnienie tej samej transakcji może zniekształcić wskaźnik, mimo że zapytanie wykona się bez błędu.
Dobre praktyki SQL i plan nauki na 2 tygodnie
Zapytanie, które wykonuje się bez błędu, nie musi zwracać poprawnej odpowiedzi biznesowej. Dlatego od początku warto ćwiczyć dwie umiejętności równolegle: czytelne zapisywanie logiki i sprawdzanie wyników. Pierwsza ułatwia poprawianie zapytań, druga chroni przed wyciąganiem wniosków z niewłaściwie wybranych lub policzonych danych.
Czytelność, aliasy i formatowanie
Dobry zapis pozwala szybko ustalić, skąd pochodzą dane, jakie warunki zastosowano i co oznacza wynik. Nie potrzebujesz rozbudowanego standardu — wystarczy kilka zasad stosowanych konsekwentnie:
- Oddzielaj główne części zapytania nowymi wierszami. Dłuższe listy kolumn i warunki zapisuj z jednakowymi wcięciami. Wielkie litery w słowach kluczowych są konwencją poprawiającą czytelność, a nie wymogiem SQL.
- Nadawaj aliasom jasne znaczenie. Aliasy tabel skracają odwołania, natomiast aliasy kolumn pomagają zrozumieć wynik. Unikaj przypadkowych skrótów oraz etykiet, które nie wyjaśniają, co zostało policzone. Alias obowiązuje w kontekście zapytania — nie zmienia trwale nazwy obiektu w bazie.
- Wybieraj potrzebne kolumny. Pobieranie wszystkich pól utrudnia przeglądanie wyników i może niepotrzebnie zwiększać ilość przesyłanych danych.
- Komentuj założenia, nie oczywistości. Warto wyjaśnić, dlaczego pomijasz anulowane zamówienia albo wybierasz konkretny okres. Komentarz powinien opisywać decyzję, której nie da się łatwo odczytać z samego zapytania.
Kontrola wyniku przed analizą
Zanim zaczniesz pisać, określ, co ma oznaczać jeden wiersz wyniku: pojedynczą transakcję, klienta czy miesiąc sprzedaży. Ustal też zakres dat i definicję mierzonej wartości. Przychód, liczba zamówień i liczba sprzedanych sztuk odpowiadają na różne pytania — nie traktuj ich zamiennie.
Buduj zapytanie etapami i po każdej zmianie sprawdzaj kilka rekordów oraz liczbę zwróconych wierszy. Porównuj obliczenia z niewielkim fragmentem danych, który potrafisz policzyć ręcznie. Zwracaj uwagę na brakujące wartości, powtórzenia i granice przedziałów dat. Ćwicz na bazie szkoleniowej lub kopii danych; do nauki odczytu nie potrzebujesz uprawnień pozwalających zmieniać dane produkcyjne.
W Cognity łączymy teorię z praktyką — dlatego pisanie zapytań SQL i sprawdzanie wyników ćwiczymy także na szkoleniach. W samodzielnej nauce pomoże Ci poniższy plan: od prostych pytań do danych po mini-analizę z uzasadnionymi wnioskami.
Tydzień 1: samodzielne zapytania i dobre nawyki
Zarezerwuj 30–45 minut dziennie. Pracuj na jednym niewielkim zbiorze danych sprzedażowych, aby skupić się na rozumowaniu, a nie na poznawaniu kolejnych struktur.
- Dni 1–2: zapisz pięć prostych pytań do danych. Dla każdego określ oczekiwane kolumny i znaczenie pojedynczego wiersza, a następnie przygotuj zapytanie.
- Dni 3–4: zmieniaj warunki i sposób porządkowania wyników. Przed wykonaniem zapytania przewiduj, co powinno się zmienić, i sprawdzaj swoją hipotezę.
- Dni 5–6: uporządkuj wcześniejsze rozwiązania: popraw wcięcia, aliasy i komentarze. Zweryfikuj ręcznie wybrane wyniki.
- Dzień 7: rozwiąż trzy wcześniejsze zadania bez zaglądania do notatek. Zapisz błędy i ich przyczyny.
Tydzień 2: od obliczeń do wniosków
- Dni 8–9: przygotuj zestawienia zbiorcze. Porównaj wyniki szczegółowe z podsumowaniami i sprawdź, czy obejmują ten sam zakres danych.
- Dni 10–11: wykonaj zadania z dodatkowymi warunkami biznesowymi. Przy każdym zapisz założenia oraz sposób kontroli poprawności.
- Dni 12–13: opracuj mini-analizę odpowiadającą na trzy powiązane pytania. Do każdego wyniku dopisz krótki wniosek i ewentualne ograniczenie interpretacji.
- Dzień 14: powtórz analizę bez kopiowania gotowych rozwiązań. Oceń, czy potrafisz wyjaśnić każdą część zapytania i uzasadnić otrzymany wynik.
Miarą postępu nie jest liczba zapamiętanych poleceń. Jest nią umiejętność przełożenia pytania na zapytanie, sprawdzenia odpowiedzi i wyjaśnienia jej komuś, kto nie zna SQL.
Najczęściej zadawane pytania i odpowiedzi odnośnie SQL Server dla początkujących – jak pisać zapytania SQL i analizować dane z baz?
Samo SSMS nie wystarczy — potrzebujesz również dostępu do działającej instancji SQL Server. SSMS jest aplikacją do pisania zapytań i przeglądania wyników, a nie silnikiem przechowującym dane. Aby rozpocząć ćwiczenia, przygotuj:
- połączenie z lokalnym lub zdalnym SQL Server,
- konto z uprawnieniami do odczytu danych,
- bazę szkoleniową z tabelami do analizy.
Zainstalowanie edytora nie tworzy automatycznie takiego środowiska.
Pierwsze zapytanie SQL zbuduj za pomocą SELECT i FROM, wskazując potrzebne kolumny oraz tabelę. Zacznij od prostego pytania, na przykład o daty i statusy zamówień. Następnie rozbudowuj zapytanie etapami:
- dodaj WHERE, aby wybrać wiersze spełniające warunek,
- użyj ORDER BY, aby uporządkować wynik,
- sprawdź kilka rekordów i porównaj je z danymi źródłowymi.
Takie podejście ułatwia znalezienie błędów i zrozumienie działania każdej części zapytania.
Użyj TOP (5) razem z ORDER BY wskazującym kolumnę liczbową i kierunek DESC. TOP ogranicza liczbę wierszy, a sortowanie malejące pozwala wybrać najwyższe wartości. Jeśli potrzebujesz jednoznacznej kolejności przy równych kwotach, dodaj unikalny identyfikator jako drugie kryterium sortowania. Samo TOP bez ORDER BY nie gwarantuje wyboru największych ani najnowszych pozycji.
Ustaw dolną granicę na początek miesiąca włącznie, a górną na początek następnego miesiąca wyłącznie. W WHERE zastosuj operator >= dla pierwszej daty i < dla drugiej. Taki przedział obejmuje również dane z ostatniego dnia, gdy kolumna przechowuje godzinę. Pozwala uniknąć pominięcia transakcji zapisanych później niż o północy tego dnia.
WHERE filtruje pojedyncze wiersze przed agregacją, a HAVING filtruje grupy po obliczeniu agregatów. WHERE wykorzystasz na przykład do wybrania sprzedaży z określonego okresu. HAVING pozwoli pozostawić tylko kategorie, których łączna sprzedaż przekracza ustalony próg. Obie klauzule mogą występować w jednym zapytaniu, ponieważ odpowiadają za różne etapy logicznego przetwarzania danych.
COUNT(*) uwzględnia wszystkie wiersze, natomiast COUNT(kolumna) i AVG(kolumna) pomijają wartości NULL. Brak wartości nie jest więc traktowany jak zero. Średnia dla wartości 100, 200 i NULL wynosi 150, a dla 100, 200 i 0 wynosi 100. Aby wyszukać brakujące informacje, stosuj IS NULL zamiast porównania = NULL. Rozróżnienie braków i zer ma bezpośredni wpływ na interpretację analizy.
Suma może być zawyżona, ponieważ połączenie tabel powiela wartości, które następnie są wielokrotnie sumowane. Jedno zamówienie może mieć kilka pozycji, więc jego dane pojawiają się w kilku wierszach wyniku. Przed agregacją ustal, czy wiersz oznacza zamówienie, czy jego pozycję. Sprawdź liczbę rekordów po połączeniu i ręcznie zweryfikuj obliczenia dla wybranych zamówień.
Najpierw oblicz łączną wartość każdego zamówienia, a dopiero potem średnią z otrzymanych kwot. Wartość pozycji wyznacz jako ilość pomnożoną przez cenę jednostkową z transakcji, nie bieżącą cenę katalogową. Każde zamówienie powinno uczestniczyć w obliczeniu średniej tylko raz. W zbiorze opisanym w artykule uwzględnij wyłącznie zamówienia zrealizowane. AVG zastosowane bezpośrednio do wartości pozycji mierzy inną wielkość.