-- 1.1 Policz wszystkich klientówSELECTCOUNT(*) AS liczba_klientowFROM Klienci;-- 1.2 Oblicz średnią cenę produktówSELECTROUND(AVG(cena), 2) AS srednia_cena_produktowFROM Produkty;-- 1.3 Najdroższy i najtańszy produkt (ceny)SELECTMAX(cena) AS najdrozsza_cena, MIN(cena) AS najtansza_cenaFROM Produkty;-- (opcjonalnie: z nazwą produktu)-- Najdroższy:SELECT nazwa, cenaFROM ProduktyORDER BY cena DESCLIMIT1;-- Najtańszy:SELECT nazwa, cenaFROM ProduktyORDER BY cena ASCLIMIT1;-- 1.4 Ilu klientów podało adres e-mail-- (COUNT(email) pomija NULL-e)SELECTCOUNT(email) AS klienci_z_mailemFROM Klienci;
Zadanie 2 – grupowanie danych
-- 2.1 Suma zamówień dla każdego klientaSELECTk.imie, k.nazwisko,SUM(p.cena) AS suma_zamowienFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuGROUP BYk.id_klienta, k.imie, k.nazwiskoORDER BY suma_zamowien DESC;-- 2.2 Średnia cena produktów w każdej kategoriiSELECTkat.nazwa_kategorii,ROUND(AVG(p.cena), 2) AS srednia_cenaFROM Produkty pJOIN Kategorie kat ONkat.id_kategorii=p.id_kategoriiGROUP BYkat.id_kategorii, kat.nazwa_kategoriiORDER BY srednia_cena DESC;-- 2.3 Ile zamówień złożył każdy klientSELECTk.imie, k.nazwisko,COUNT(z.id_zamowienia) AS liczba_zamowienFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaGROUP BYk.id_klienta, k.imie, k.nazwiskoORDER BY liczba_zamowien DESC, k.nazwisko, k.imie;-- 2.4 Ilu klientów pochodzi z każdego miastaSELECT miasto,COUNT(*) AS liczba_klientowFROM KlienciGROUP BY miastoORDER BY liczba_klientow DESC, miasto;
Zadanie 3 – HAVING i sortowanie
-- 3.1 Kategorie, których średnia cena > 200 zł, malejącoSELECTkat.nazwa_kategorii,ROUND(AVG(p.cena), 2) AS srednia_cenaFROM Produkty pJOIN Kategorie kat ONkat.id_kategorii=p.id_kategoriiGROUP BYkat.id_kategorii, kat.nazwa_kategoriiHAVINGAVG(p.cena) >200ORDER BY srednia_cena DESC;-- 3.2 Klienci z więcej niż jednym zamówieniemSELECTk.imie, k.nazwisko,COUNT(z.id_zamowienia) AS liczbaFROM Klienci kJOIN Zamowienia z ONk.id_klienta=z.id_klientaGROUP BYk.imie, k.nazwiskoHAVINGCOUNT(z.id_zamowienia) >1ORDER BY liczba DESC, k.nazwisko, k.imie;
Zadanie 3 – HAVING i sortowanie
Kategorie, gdzie średnia cena > 200 zł, posortowane malejąco:
SELECTkat.nazwa_kategorii,AVG(p.cena) AS srednia_cenaFROM Produkty pJOIN Kategorie kat ONkat.id_kategorii=p.id_kategoriiGROUP BYkat.nazwa_kategoriiHAVINGAVG(p.cena) >200ORDER BY srednia_cena DESC;
Klienci z > 1 zamówieniem:
SELECTk.imie, k.nazwisko,COUNT(z.id_zamowienia) AS liczbaFROM Klienci kJOIN Zamowienia z ONk.id_klienta=z.id_klientaGROUP BYk.imie, k.nazwiskoHAVINGCOUNT(z.id_zamowienia) >1ORDER BY liczba DESC, k.nazwisko, k.imie;
Zadanie 4 – JOIN + filtry na datach (doprecyzowane)
Lista wszystkich zamówień (imię, nazwisko, produkt, cena, data):
SELECTk.imie, k.nazwisko,p.nazwaAS produkt, p.cena,z.data_zamowieniaFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuORDER BYz.data_zamowienia, k.nazwisko, k.imie;
Tylko wrzesień 2025:
SELECTk.imie, k.nazwisko, p.nazwa, p.cena, z.data_zamowieniaFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuWHEREz.data_zamowieniaBETWEEN'2025-09-01'AND'2025-09-30'ORDER BYz.data_zamowienia;
Dzienna wartość sprzedaży:
SELECTz.data_zamowienia,SUM(p.cena) AS wartosc_dniaFROM Zamowienia zJOIN Produkty p ONp.id_produktu=z.id_produktuGROUP BYz.data_zamowieniaORDER BYz.data_zamowienia;
3 najdroższe pojedyncze zamówienia (po cenie produktu):
SELECTz.id_zamowienia, k.imie, k.nazwisko,p.nazwa, p.cena, z.data_zamowieniaFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuORDER BYp.cenaDESC, z.id_zamowieniaDESCLIMIT3;
SELECT p.*FROM Produkty pLEFT JOIN Zamowienia z ONz.id_produktu=p.id_produktuWHEREz.id_zamowieniaISNULLORDER BYp.nazwa;
Klienci, którzy kupili ≥ 2 różne produkty w tej samej kategorii:
SELECTk.imie, k.nazwisko, kat.nazwa_kategorii,COUNT(DISTINCTp.id_produktu) AS rozne_produktyFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuJOIN Kategorie kat ONkat.id_kategorii=p.id_kategoriiGROUP BYk.id_klienta, kat.id_kategoriiHAVINGCOUNT(DISTINCTp.id_produktu) >=2ORDER BYk.nazwisko, k.imie, kat.nazwa_kategorii;
Zadanie 6 – raporty, ranking i widok (uzupełnione)
Wartość sprzedaży per kategoria:
SELECTkat.nazwa_kategorii,SUM(p.cena) AS wartosc_sprzedazyFROM Zamowienia zJOIN Produkty p ONp.id_produktu=z.id_produktuJOIN Kategorie kat ONkat.id_kategorii=p.id_kategoriiGROUP BYkat.nazwa_kategoriiORDER BY wartosc_sprzedazy DESC;
Średnia cena zamawianych produktów per miasto:
SELECTk.miasto,ROUND(AVG(p.cena), 2) AS srednia_cenaFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuGROUP BYk.miastoORDER BY srednia_cena DESC, k.miasto;
Miasto z największą liczbą zamówień (TOP 1):
SELECTk.miasto, COUNT(*) AS liczba_zamowienFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaGROUP BYk.miastoORDER BY liczba_zamowien DESCLIMIT1;
Widok szczegółów zamówień:
CREATE OR REPLACEVIEWWidok_Zamowienia_SzczegolyASSELECTz.id_zamowienia,z.data_zamowienia,k.imie, k.nazwisko, k.miasto,p.nazwaAS produkt, p.cena,kat.nazwa_kategoriiAS kategoriaFROM Zamowienia zJOIN Klienci k ONk.id_klienta=z.id_klientaJOIN Produkty p ONp.id_produktu=z.id_produktuJOIN Kategorie kat ONkat.id_kategorii=p.id_kategorii;-- podgląd:SELECT*FROM Widok_Zamowienia_SzczegolyORDER BY data_zamowienia, id_zamowienia;