it-praxisportal/courses/sql/15_views_und_gespeicherte_logik/musterloesung.sql

114 lines
3.7 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================================
-- 💡 SQL 15: MUSTERLÖSUNG – VIEWS & TRIGGER 💡
-- ============================================================================
CREATE TABLE IF NOT EXISTS kunden (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
passwort_hash TEXT NOT NULL,
stadt TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS produkte (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
preis REAL NOT NULL,
lagerbestand INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS bestellungen (
id INTEGER PRIMARY KEY,
kunde_id INTEGER NOT NULL,
bestell_datum TEXT NOT NULL,
gesamtbetrag REAL NOT NULL,
FOREIGN KEY (kunde_id) REFERENCES kunden(id)
);
CREATE TABLE IF NOT EXISTS bestellpositionen (
id INTEGER PRIMARY KEY AUTOINCREMENT,
bestell_id INTEGER NOT NULL,
produkt_id INTEGER NOT NULL,
menge INTEGER NOT NULL,
einzelpreis REAL NOT NULL,
FOREIGN KEY (bestell_id) REFERENCES bestellungen(id),
FOREIGN KEY (produkt_id) REFERENCES produkte(id)
);
CREATE TABLE IF NOT EXISTS audit_preis_historie (
id INTEGER PRIMARY KEY AUTOINCREMENT,
produkt_id INTEGER NOT NULL,
alter_preis REAL NOT NULL,
neuer_preis REAL NOT NULL,
aenderungs_datum TEXT NOT NULL
);
INSERT OR REPLACE INTO kunden (id, name, email, passwort_hash, stadt) VALUES
(1, 'Alice Becker', 'alice@example.com', '$2y$12$e8Y7G...', 'Berlin'),
(2, 'Bob Meier', 'bob@example.com', '$2y$12$K9j2L...', 'Hamburg'),
(3, 'Carla Wagner', 'carla@example.com', '$2y$12$P3m8Q...', 'München');
INSERT OR REPLACE INTO produkte (id, name, preis, lagerbestand) VALUES
(101, '4K OLED Monitor 32"', 899.00, 50),
(102, 'Ergonomische Tastatur Pro', 149.00, 100),
(103, 'Wireless Noise Cancelling Headset', 249.00, 30);
INSERT OR REPLACE INTO bestellungen (id, kunde_id, bestell_datum, gesamtbetrag) VALUES
(1, 1, '2024-02-10', 1048.00),
(2, 1, '2024-03-01', 249.00),
(3, 2, '2024-02-15', 899.00);
INSERT OR REPLACE INTO bestellpositionen (bestell_id, produkt_id, menge, einzelpreis) VALUES
(1, 101, 1, 899.00),
(1, 102, 1, 149.00),
(2, 103, 1, 249.00),
(3, 101, 1, 899.00);
-- 🎯 TODO 1: View v_kunden_bestell_cockpit
DROP VIEW IF EXISTS v_kunden_bestell_cockpit;
CREATE VIEW v_kunden_bestell_cockpit AS
SELECT
k.id AS kunde_id,
k.name,
k.email,
k.stadt,
COUNT(b.id) AS anzahl_bestellungen,
COALESCE(SUM(b.gesamtbetrag), 0.0) AS gesamt_umsatz,
MAX(b.bestell_datum) AS letzte_bestellung
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
GROUP BY k.id, k.name, k.email, k.stadt;
-- 🎯 TODO 2: View v_top_seller_uebersicht
DROP VIEW IF EXISTS v_top_seller_uebersicht;
CREATE VIEW v_top_seller_uebersicht AS
SELECT
p.id AS produkt_id,
p.name AS produkt_name,
p.preis AS aktueller_preis,
COALESCE(SUM(bp.menge), 0) AS verkaufte_menge,
COALESCE(SUM(bp.menge * bp.einzelpreis), 0.0) AS gesamt_erloes
FROM produkte p
LEFT JOIN bestellpositionen bp ON p.id = bp.produkt_id
GROUP BY p.id, p.name, p.preis;
-- 🎯 TODO 3: Trigger trg_lagerbestand_reduzieren
DROP TRIGGER IF EXISTS trg_lagerbestand_reduzieren;
CREATE TRIGGER trg_lagerbestand_reduzieren
AFTER INSERT ON bestellpositionen
FOR EACH ROW
BEGIN
UPDATE produkte
SET lagerbestand = lagerbestand - NEW.menge
WHERE id = NEW.produkt_id;
END;
-- 🎯 TODO 4: Trigger trg_preis_historie_audit
DROP TRIGGER IF EXISTS trg_preis_historie_audit;
CREATE TRIGGER trg_preis_historie_audit
AFTER UPDATE OF preis ON produkte
FOR EACH ROW
BEGIN
INSERT INTO audit_preis_historie (produkt_id, alter_preis, neuer_preis, aenderungs_datum)
VALUES (OLD.id, OLD.preis, NEW.preis, '2024-03-15 12:00:00');
END;