Untitled
unknown
plain_text
a year ago
10 kB
4
Indexable
-- Czyszczenie tabel, jeśli istnieją IF OBJECT_ID('Produkty', 'U') IS NOT NULL DROP TABLE Produkty; IF OBJECT_ID('Klienci', 'U') IS NOT NULL DROP TABLE Klienci; IF OBJECT_ID('Sprzedaz', 'U') IS NOT NULL DROP TABLE Sprzedaz; IF OBJECT_ID('fakt_sprzedazy', 'U') IS NOT NULL DROP TABLE fakt_sprzedazy; IF OBJECT_ID('wymiar_produkty', 'U') IS NOT NULL DROP TABLE wymiar_produkty; IF OBJECT_ID('wymiar_klienci', 'U') IS NOT NULL DROP TABLE wymiar_klienci; IF OBJECT_ID('wymiar_data', 'U') IS NOT NULL DROP TABLE wymiar_data; IF OBJECT_ID('wymiar_produkty_scd2', 'U') IS NOT NULL DROP TABLE wymiar_produkty_scd2; -- Tworzenie tabel CREATE TABLE Produkty ( id INT PRIMARY KEY, nazwa VARCHAR(100), kategoria VARCHAR(50), cena FLOAT ); CREATE TABLE Klienci ( id INT PRIMARY KEY, imie VARCHAR(50), nazwisko VARCHAR(50), email VARCHAR(100), miasto VARCHAR(100) ); CREATE TABLE Sprzedaz ( id INT PRIMARY KEY, data_sprzedazy DATE, id_produktu INT, id_klienta INT, ilosc INT, FOREIGN KEY (id_produktu) REFERENCES Produkty(id), FOREIGN KEY (id_klienta) REFERENCES Klienci(id) ); CREATE TABLE wymiar_data ( data DATE PRIMARY KEY, rok INT, miesiac INT, dzien INT ); CREATE TABLE wymiar_produkty ( id INT PRIMARY KEY, nazwa VARCHAR(100), kategoria VARCHAR(50), cena FLOAT ); CREATE TABLE wymiar_klienci ( id INT PRIMARY KEY, imie VARCHAR(50), nazwisko VARCHAR(50), email VARCHAR(100) ); CREATE TABLE fakt_sprzedazy ( id INT IDENTITY(1,1) PRIMARY KEY, data_sprzedazy DATE, id_produktu INT, id_klienta INT, kwota FLOAT, FOREIGN KEY (data_sprzedazy) REFERENCES wymiar_data(data), FOREIGN KEY (id_produktu) REFERENCES wymiar_produkty(id), FOREIGN KEY (id_klienta) REFERENCES wymiar_klienci(id) ); DECLARE @startDate DATE = '2024-01-01'; DECLARE @endDate DATE = '2024-12-31'; WHILE @startDate <= @endDate BEGIN INSERT INTO wymiar_data (data, rok, miesiac, dzien) VALUES ( @startDate, YEAR(@startDate), MONTH(@startDate), DAY(@startDate) ); SET @startDate = DATEADD(DAY, 1, @startDate); END; INSERT INTO Produkty (id, nazwa, kategoria, cena) VALUES (1, 'Laptop Gamingowy', 'Elektronika', 3500.00), (2, 'Smartfon Premium', 'Elektronika', 2200.00), (3, 'Tablet Graficzny', 'Elektronika', 1200.00), (4, 'Drukarka Laserowa', 'Elektronika', 500.00), (5, 'Głośnik Bluetooth', 'Elektronika', 250.00), (6, 'Słuchawki Bezprzewodowe', 'Elektronika', 180.00), (7, 'Monitor Ultrawide', 'Elektronika', 1500.00), (8, 'Mysz Gamingowa', 'Elektronika', 80.00), (9, 'Klawiatura Mechaniczna', 'Elektronika', 160.00), (10, 'Konsola do gier', 'Elektronika', 2000.00), (11, 'Telewizor 4K', 'Elektronika', 3000.00), (12, 'Aparat fotograficzny', 'Elektronika', 4000.00), (13, 'Skuter Elektryczny', 'Pojazdy', 4000.00), (14, 'Rower Górski', 'Pojazdy', 2800.00), (15, 'Hulajnoga Elektryczna', 'Pojazdy', 600.00), (16, 'Deskorolka Elektryczna', 'Pojazdy', 800.00), (17, 'Kask Rowerowy', 'Pojazdy', 150.00), (18, 'Samochód osobowy', 'Pojazdy', 50000.00), (19, 'Motocykl', 'Pojazdy', 25000.00), (20, 'Kurtka Zimowa', 'Odzież', 350.00), (21, 'Buty Trekkingowe', 'Odzież', 200.00), (22, 'Koszula Elegancka', 'Odzież', 120.00), (23, 'Spodnie Jeansowe', 'Odzież', 180.00), (24, 'Sukienka Letnia', 'Odzież', 220.00), (25, 'Sweter', 'Odzież', 150.00), (26, 'Bluza', 'Odzież', 100.00), (27, 'Powieść Fantasy', 'Książki', 45.00), (28, 'Thriller', 'Książki', 35.00), (29, 'Kryminał', 'Książki', 40.00), (30, 'Biografia', 'Książki', 50.00), (31, 'Poradnik', 'Książki', 60.00), (32, 'Komiks', 'Książki', 30.00), (33, 'Podręcznik', 'Książki', 80.00); INSERT INTO Klienci (id, imie, nazwisko, email, miasto) VALUES (1, 'Jan', 'Kowalski', 'jan.kowalski@gmail.com', 'Warszawa'), (2, 'Anna', 'Nowak', 'anna.nowak@wp.pl', 'Kraków'), (3, 'Paweł', 'Wiśniewski', 'pawel.wisniewski@onet.pl', 'Gdańsk'), (4, 'Ewa', 'Wójcik', 'ewa.wojcik@gmail.com', 'Poznań'), (5, 'Marek', 'Kowalczyk', 'marek.kowalczyk@wp.pl', 'Wrocław'), (6, 'Agnieszka', 'Kamińska', 'agnieszka.kaminska@onet.pl', 'Łódź'), (7, 'Tomasz', 'Lewandowski', 'tomasz.lewandowski@gmail.com', 'Warszawa'), (8, 'Karolina', 'Nowicka', 'karolina.nowicka@wp.pl', 'Kraków'), (9, 'Robert', 'Zieliński', 'robert.zielinski@onet.pl', 'Gdańsk'), (10, 'Marta', 'Szymańska', 'marta.szymanska@gmail.com', 'Poznań'), (11, 'Katarzyna', 'Woźniak', 'katarzyna.wozniak@gmail.com', 'Warszawa'), (12, 'Piotr', 'Nowicki', 'piotr.nowicki@wp.pl', 'Kraków'), (13, 'Andrzej', 'Kwiatkowski', 'andrzej.kwiatkowski@onet.pl', 'Gdańsk'), (14, 'Małgorzata', 'Lewandowska', 'malgorzata.lewandowska@gmail.com', 'Poznań'), (15, 'Krzysztof', 'Jankowski', 'krzysztof.jankowski@wp.pl', 'Wrocław'), (16, 'Magdalena', 'Woźniak', 'magdalena.wozniak@example.com', 'Wrocław'), (17, 'Michał', 'Majewski', 'michal.majewski@example.com', 'Toruń'), (18, 'Joanna', 'Rutkowska', 'joanna.rutkowska@example.com', 'Wrocław'), (19, 'Marcin', 'Sadowski', 'marcin.sadowski@example.com', 'Toruń'), (20, 'Katarzyna', 'Wysocka', 'katarzyna.wysocka@example.com', 'Wrocław'), (21, 'Bartłomiej', 'Zieliński', 'bartlomiej.zielinski@example.com', 'Toruń'), (22, 'Izabela', 'Jankowska', 'izabela.jankowska@example.com', 'Toruń'), (23, 'Sebastian', 'Zawadzki', 'sebastian.zawadzki@example.com', 'Wrocław'), (24, 'Dominika', 'Sawicka', 'dominika.sawicka@example.com', 'Toruń'), (25, 'Wojciech', 'Borkowski', 'wojciech.borkowski@example.com', 'Toruń'), (26, 'Patrycja', 'Lis', 'patrycja.lis@example.com', 'Wrocław'), (27, 'Łukasz', 'Adamski', 'lukasz.adamski@example.com', 'Toruń'), (28, 'Aleksandra', 'Król', 'aleksandra.krol@example.com', 'Wrocław'), (29, 'Mateusz', 'Czarnecki', 'mateusz.czarnecki@example.com', 'Toruń'), (30, 'Monika', 'Gajewska', 'monika.gajewska@example.com', 'Toruń'); DECLARE @i INT = 1; WHILE @i <= 500 -- Zwiększamy liczbę transakcji do 500 BEGIN INSERT INTO Sprzedaz (id, data_sprzedazy, id_produktu, id_klienta, ilosc) VALUES ( @i, DATEADD(DAY, -ROUND(RAND() * 365, 0), GETDATE()), ROUND(RAND() * 32 + 1, 0), ROUND(RAND() * 14 + 1, 0), ROUND(RAND() * 5 + 1, 0) ); SET @i = @i + 1; END; INSERT INTO wymiar_produkty (id, nazwa, kategoria, cena) SELECT id, nazwa, kategoria, cena FROM Produkty; INSERT INTO wymiar_klienci (id, imie, nazwisko, email) SELECT id, imie, nazwisko, email FROM Klienci; -- ETL dla tabeli faktów z agregacją -- Dodanie brakujących dat do wymiar_data INSERT INTO wymiar_data (data, rok, miesiac, dzien) SELECT DISTINCT s.data_sprzedazy, YEAR(s.data_sprzedazy), MONTH(s.data_sprzedazy), DAY(s.data_sprzedazy) FROM Sprzedaz s WHERE NOT EXISTS ( SELECT 1 FROM wymiar_data d WHERE d.data = s.data_sprzedazy ); -- Wstawienie danych do fakt_sprzedazy INSERT INTO fakt_sprzedazy (data_sprzedazy, id_produktu, id_klienta, kwota) SELECT s.data_sprzedazy, s.id_produktu, s.id_klienta, SUM(s.ilosc * p.cena) AS kwota FROM Sprzedaz s JOIN Produkty p ON s.id_produktu = p.id GROUP BY s.data_sprzedazy, s.id_produktu, s.id_klienta; -- Obsługa Delty Danych -- Aktualizowanie istniejących wierszy w tabeli fakt_sprzedazy UPDATE fakt_sprzedazy SET data_sprzedazy = '2024-05-01', id_produktu = 1, id_klienta = 1, kwota = 1103.00 WHERE id = 2503; UPDATE fakt_sprzedazy SET data_sprzedazy = '2024-05-02', id_produktu = 2, id_klienta = 2, kwota = 20.00 WHERE id = 2502; -- Dodawanie nowych wierszy do tabeli fakt_sprzedazy IF NOT EXISTS (SELECT * FROM fakt_sprzedazy WHERE id = 4) BEGIN INSERT INTO fakt_sprzedazy (data_sprzedazy, id_produktu, id_klienta, kwota) -- Usunięto id z listy kolumn VALUES ('2024-05-04', 3, 3, 90.00); END; SELECT * FROM fakt_sprzedazy; -- Implementacja SCD2 dla tabeli wymiarów IF OBJECT_ID('wymiar_produkty_scd2', 'U') IS NOT NULL DROP TABLE wymiar_produkty_scd2; CREATE TABLE wymiar_produkty_scd2 ( id INT, nazwa VARCHAR(100), kategoria VARCHAR(50), cena FLOAT, data_start DATE, data_end DATE, PRIMARY KEY (id, data_start) ); -- Ładowanie danych do tabeli SCD2 TRUNCATE TABLE wymiar_produkty_scd2 INSERT INTO wymiar_produkty_scd2 (id, nazwa, kategoria, cena, data_start, data_end) SELECT id, nazwa, kategoria, cena, '2024-01-01', '2024-12-31' FROM wymiar_produkty; SELECT * FROM wymiar_produkty_scd2 -- Deklaracja zmiennej @currentDate DECLARE @currentDate DATE = GETDATE(); -- Zamknięcie starego rekordu UPDATE wymiar_produkty_scd2 SET data_end = @currentDate WHERE id = 1 AND data_end = '2024-12-31'; SELECT * FROM wymiar_produkty_scd2 -- Wstawienie nowego rekordu TRUNCATE TABLE wymiar_produkty_scd2 INSERT INTO wymiar_produkty_scd2 (id, nazwa, kategoria, cena, data_start, data_end) VALUES (1, 'Monitor', 'Elektronika', 275.00, @currentDate, '2024-10-01'); --Select SELECT * FROM wymiar_produkty_scd2 --GROUPBY SELECT wk.id AS KlientID, wk.imie + ' ' + wk.nazwisko AS Klient, AVG(fs.kwota) AS SredniaWartoscZamowienia FROM fakt_sprzedazy fs JOIN wymiar_klienci wk ON fs.id_klienta = wk.id GROUP BY wk.id, wk.imie, wk.nazwisko; --JOINY SELECT wymiar_klienci.imie, wymiar_klienci.nazwisko, wymiar_produkty.nazwa, wymiar_produkty.cena, fakt_sprzedazy.data_sprzedazy FROM fakt_sprzedazy LEFT JOIN wymiar_klienci ON fakt_sprzedazy.id_klienta = wymiar_klienci.id LEFT JOIN wymiar_produkty ON fakt_sprzedazy.id_produktu = wymiar_produkty.id WHERE fakt_sprzedazy.data_sprzedazy >= '2024-05-30'; --ORDER SELECT wp.id AS ProduktID, wp.nazwa AS Produkt, COUNT(fs.id) AS LiczbaZamowien, SUM(fs.kwota) AS SumaKwot FROM fakt_sprzedazy fs JOIN wymiar_produkty wp ON fs.id_produktu = wp.id GROUP BY wp.id, wp.nazwa ORDER BY SumaKwot DESC; --PARTITION + funkcja AVG SELECT kategoria, AVG(cena) OVER (PARTITION BY kategoria) AS SredniaCena FROM wymiar_produkty; --HAVING SELECT wp.kategoria, COUNT(fs.id) AS LiczbaZamowien, SUM(fs.kwota) AS SumaKwot FROM fakt_sprzedazy fs JOIN wymiar_produkty wp ON fs.id_produktu = wp.id GROUP BY wp.kategoria HAVING SUM(fs.kwota) > 1000;
Editor is loading...
Leave a Comment