106 lines
3.1 KiB
SQL
106 lines
3.1 KiB
SQL
-- ============================================================================
|
||
-- 💡 SQL 12: MUSTERLÖSUNG – WINDOW FUNCTIONS 💡
|
||
-- ============================================================================
|
||
|
||
CREATE TABLE IF NOT EXISTS artikel (
|
||
id INTEGER PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
kategorie_id INTEGER NOT NULL,
|
||
preis REAL NOT NULL
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS tages_umsatz (
|
||
datum TEXT PRIMARY KEY,
|
||
umsatz REAL NOT NULL,
|
||
bestellungen INTEGER NOT NULL
|
||
);
|
||
|
||
CREATE TABLE IF NOT EXISTS transaktionen (
|
||
id INTEGER PRIMARY KEY,
|
||
kunde_id INTEGER NOT NULL,
|
||
datum TEXT NOT NULL,
|
||
betrag REAL NOT NULL
|
||
);
|
||
|
||
INSERT OR REPLACE INTO artikel (id, name, kategorie_id, preis) VALUES
|
||
(1, 'Laptop Gaming X', 1, 1499.00),
|
||
(2, 'Laptop Business Ultrabook', 1, 1499.00),
|
||
(3, 'Laptop Student Basic', 1, 699.00),
|
||
(4, 'Tastatur Mechanisch', 2, 129.00),
|
||
(5, 'Tastatur Membran', 2, 39.00),
|
||
(6, 'Maus RGB Gaming', 2, 69.00),
|
||
(7, 'Maus Ergonomisch', 2, 69.00),
|
||
(8, 'Maus Standard Office', 2, 19.00);
|
||
|
||
INSERT OR REPLACE INTO tages_umsatz (datum, umsatz, bestellungen) VALUES
|
||
('2024-03-01', 1200.00, 15),
|
||
('2024-03-02', 1800.00, 22),
|
||
('2024-03-03', 1500.00, 19),
|
||
('2024-03-04', 2100.00, 26),
|
||
('2024-03-05', 2400.00, 30),
|
||
('2024-03-06', 1900.00, 24),
|
||
('2024-03-07', 2800.00, 35);
|
||
|
||
INSERT OR REPLACE INTO transaktionen (id, kunde_id, datum, betrag) VALUES
|
||
(1, 101, '2024-01-05', 150.00),
|
||
(2, 101, '2024-01-20', 300.00),
|
||
(3, 101, '2024-02-10', 450.00),
|
||
(4, 102, '2024-01-08', 500.00),
|
||
(5, 102, '2024-02-14', 250.00),
|
||
(6, 103, '2024-01-12', 120.00),
|
||
(7, 103, '2024-01-19', 80.00),
|
||
(8, 103, '2024-02-25', 400.00);
|
||
|
||
-- 🎯 TODO 1: Ranking-Vergleich
|
||
SELECT
|
||
id,
|
||
name,
|
||
kategorie_id,
|
||
preis,
|
||
ROW_NUMBER() OVER (PARTITION BY kategorie_id ORDER BY preis DESC, id ASC) AS row_num,
|
||
RANK() OVER (PARTITION BY kategorie_id ORDER BY preis DESC) AS preis_rank,
|
||
DENSE_RANK() OVER (PARTITION BY kategorie_id ORDER BY preis DESC) AS dense_rank
|
||
FROM artikel
|
||
ORDER BY kategorie_id ASC, row_num ASC;
|
||
|
||
-- 🎯 TODO 2: Time-Series Analyse mit LAG
|
||
SELECT
|
||
datum,
|
||
umsatz,
|
||
LAG(umsatz, 1, 0) OVER (ORDER BY datum ASC) AS vortag_umsatz,
|
||
umsatz - LAG(umsatz, 1, umsatz) OVER (ORDER BY datum ASC) AS delta_umsatz,
|
||
ROUND(
|
||
(umsatz - LAG(umsatz, 1, umsatz) OVER (ORDER BY datum ASC)) * 100.0 /
|
||
LAG(umsatz, 1, umsatz) OVER (ORDER BY datum ASC),
|
||
2
|
||
) AS wachstum_prozent
|
||
FROM tages_umsatz
|
||
ORDER BY datum ASC;
|
||
|
||
-- 🎯 TODO 3: Running Total (Kumulierter Kunden-Umsatz)
|
||
SELECT
|
||
id,
|
||
kunde_id,
|
||
datum,
|
||
betrag,
|
||
SUM(betrag) OVER (
|
||
PARTITION BY kunde_id
|
||
ORDER BY datum ASC, id ASC
|
||
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
|
||
) AS laufender_umsatz
|
||
FROM transaktionen
|
||
ORDER BY kunde_id ASC, datum ASC;
|
||
|
||
-- 🎯 TODO 4: Gleitender 3-Tage Durchschnitt (Moving Average)
|
||
SELECT
|
||
datum,
|
||
umsatz,
|
||
ROUND(
|
||
AVG(umsatz) OVER (
|
||
ORDER BY datum ASC
|
||
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
|
||
),
|
||
2
|
||
) AS ma_3_tage
|
||
FROM tages_umsatz
|
||
ORDER BY datum ASC;
|