-- ============================================================ -- Tierarztpraxis DWH — Star Schema (PostgreSQL) -- Kapitel 19: Data Warehousing -- ============================================================ DROP TABLE IF EXISTS fakt_behandlung CASCADE; DROP TABLE IF EXISTS dim_zeit CASCADE; DROP TABLE IF EXISTS dim_tier CASCADE; DROP TABLE IF EXISTS dim_tierarzt CASCADE; DROP TABLE IF EXISTS dim_diagnose CASCADE; DROP TABLE IF EXISTS dim_praxis CASCADE; -- ============================================================ -- Dimensionstabellen (denormalisiert) -- ============================================================ CREATE TABLE dim_zeit ( zeit_id SERIAL PRIMARY KEY, datum DATE NOT NULL UNIQUE, wochentag VARCHAR(10), monat INT, monatsname VARCHAR(10), quartal INT, jahr INT ); CREATE TABLE dim_tier ( tier_id SERIAL PRIMARY KEY, name VARCHAR(50), tierart VARCHAR(30), rasse VARCHAR(50), geschlecht CHAR(1), besitzer VARCHAR(80), ort VARCHAR(50) ); CREATE TABLE dim_tierarzt ( tierarzt_id SERIAL PRIMARY KEY, name VARCHAR(80), rolle VARCHAR(30), praxis VARCHAR(80), gueltig_von DATE DEFAULT '2000-01-01', gueltig_bis DATE DEFAULT '9999-12-31', aktuell BOOLEAN DEFAULT TRUE ); CREATE TABLE dim_diagnose ( diagnose_id SERIAL PRIMARY KEY, diagnose VARCHAR(100), kategorie VARCHAR(50) ); CREATE TABLE dim_praxis ( praxis_id SERIAL PRIMARY KEY, name VARCHAR(80), ort VARCHAR(50), region VARCHAR(30) ); -- ============================================================ -- Faktentabelle -- ============================================================ CREATE TABLE fakt_behandlung ( behandlung_id SERIAL PRIMARY KEY, zeit_id INT NOT NULL REFERENCES dim_zeit, tier_id INT NOT NULL REFERENCES dim_tier, tierarzt_id INT NOT NULL REFERENCES dim_tierarzt, diagnose_id INT NOT NULL REFERENCES dim_diagnose, praxis_id INT NOT NULL REFERENCES dim_praxis, kosten NUMERIC(10,2) NOT NULL, dauer_min INT, medikamente INT DEFAULT 0 ); -- ============================================================ -- Zeitdimension fuellen (2025-01-01 bis 2026-06-30) -- ============================================================ INSERT INTO dim_zeit (datum, wochentag, monat, monatsname, quartal, jahr) SELECT d, to_char(d, 'Dy'), EXTRACT(MONTH FROM d)::INT, to_char(d, 'Mon'), EXTRACT(QUARTER FROM d)::INT, EXTRACT(YEAR FROM d)::INT FROM generate_series('2025-01-01'::DATE, '2026-06-30'::DATE, '1 day') AS d; -- ============================================================ -- Praxen -- ============================================================ INSERT INTO dim_praxis (name, ort, region) VALUES ('Tierarztpraxis Juckstadt', 'Juckstadt', 'Mittelhessen'), ('Kleintierpraxis Waldrand', 'Bellhausen', 'Mittelhessen'), ('Pferdepraxis Schmidt', 'Reitdorf', 'Oberhessen'); -- ============================================================ -- Tieraerzte -- ============================================================ INSERT INTO dim_tierarzt (name, rolle, praxis) VALUES ('Dr. Jo Katzner', 'Tierarzt', 'Tierarztpraxis Juckstadt'), ('Kim Canini', 'Tieraerztin', 'Tierarztpraxis Juckstadt'), ('Dr. Mueller', 'Tierarzt', 'Kleintierpraxis Waldrand'), ('Dr. Schmidt', 'Tierarzt', 'Pferdepraxis Schmidt'); -- ============================================================ -- Tiere (denormalisiert: Tierart+Rasse+Besitzer in einer Tabelle) -- ============================================================ INSERT INTO dim_tier (name, tierart, rasse, geschlecht, besitzer, ort) VALUES ('Bello', 'Hund', 'Labrador', 'm', 'Hans Berger', 'Juckstadt'), ('Rex', 'Hund', 'Schaeferhund', 'm', 'Anna Waldner', 'Juckstadt'), ('Luna', 'Hund', 'Golden Retriever', 'w', 'Tom Fuchs', 'Juckstadt'), ('Mimi', 'Katze', 'Perser', 'w', 'Hans Berger', 'Juckstadt'), ('Minka', 'Katze', 'Europaeisch Kurzhaar','w', 'Lisa Meier', 'Bellhausen'), ('Felix', 'Katze', 'Maine Coon', 'm', 'Eva Braun', 'Bellhausen'), ('Speedy', 'Schildkroete','Griechische', 'm', 'Tom Fuchs', 'Juckstadt'), ('Tweety', 'Wellensittich','Standard', 'm', 'Tom Fuchs', 'Juckstadt'), ('Hanni', 'Kaninchen','Zwergkaninchen', 'w', 'Sara Klein', 'Bellhausen'), ('Blitz', 'Pferd', 'Hannoveraner', 'm', 'Karl Reiter', 'Reitdorf'), ('Sternchen','Pferd', 'Haflinger', 'w', 'Maria Hof', 'Reitdorf'), ('Bruno', 'Hund', 'Boxer', 'm', 'Eva Braun', 'Bellhausen'); -- ============================================================ -- Diagnosen -- ============================================================ INSERT INTO dim_diagnose (diagnose, kategorie) VALUES ('Impfung', 'Vorsorge'), ('Entwurmung', 'Vorsorge'), ('Routineuntersuchung', 'Vorsorge'), ('Bisswunde', 'Verletzung'), ('Knochenbruch', 'Verletzung'), ('Ohrenentzuendung', 'Infektion'), ('Katzenschnupfen', 'Infektion'), ('Hautpilz', 'Infektion'), ('Zahnstein', 'Zahnmedizin'), ('Kastration', 'Chirurgie'), ('Tumor-OP', 'Chirurgie'), ('Lahmheit', 'Orthopaedie'), ('Kolik', 'Notfall'), ('Panzerkontrolle', 'Vorsorge'), ('Federrupfen', 'Verhalten'); -- ============================================================ -- Behandlungen (60 Fakten, verteilt ueber 2025-Q1 bis 2026-Q2) -- ============================================================ INSERT INTO fakt_behandlung (zeit_id, tier_id, tierarzt_id, diagnose_id, praxis_id, kosten, dauer_min, medikamente) SELECT z.zeit_id, t.tier_id, ta.tierarzt_id, d.diagnose_id, p.praxis_id, v.kosten, v.dauer_min, v.medikamente FROM (VALUES -- 2025 Q1 ('2025-01-08', 'Bello', 'Dr. Jo Katzner', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), ('2025-01-10', 'Mimi', 'Kim Canini', 'Entwurmung', 'Tierarztpraxis Juckstadt', 25.00, 10, 1), ('2025-01-15', 'Rex', 'Dr. Jo Katzner', 'Bisswunde', 'Tierarztpraxis Juckstadt', 120.00, 45, 2), ('2025-01-22', 'Minka', 'Dr. Mueller', 'Katzenschnupfen', 'Kleintierpraxis Waldrand', 85.00, 30, 2), ('2025-02-05', 'Blitz', 'Dr. Schmidt', 'Lahmheit', 'Pferdepraxis Schmidt', 180.00, 60, 1), ('2025-02-12', 'Luna', 'Kim Canini', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00, 20, 0), ('2025-02-20', 'Felix', 'Dr. Mueller', 'Hautpilz', 'Kleintierpraxis Waldrand', 65.00, 25, 1), ('2025-03-03', 'Speedy', 'Dr. Jo Katzner', 'Panzerkontrolle', 'Tierarztpraxis Juckstadt', 55.00, 20, 0), ('2025-03-10', 'Hanni', 'Dr. Mueller', 'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00, 15, 0), ('2025-03-18', 'Bello', 'Dr. Jo Katzner', 'Zahnstein', 'Tierarztpraxis Juckstadt', 95.00, 40, 1), -- 2025 Q2 ('2025-04-02', 'Sternchen','Dr. Schmidt', 'Impfung', 'Pferdepraxis Schmidt', 60.00, 20, 1), ('2025-04-10', 'Rex', 'Dr. Jo Katzner', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), ('2025-04-15', 'Mimi', 'Kim Canini', 'Impfung', 'Tierarztpraxis Juckstadt', 40.00, 15, 1), ('2025-04-22', 'Bruno', 'Dr. Mueller', 'Ohrenentzuendung', 'Kleintierpraxis Waldrand', 70.00, 25, 2), ('2025-05-05', 'Blitz', 'Dr. Schmidt', 'Impfung', 'Pferdepraxis Schmidt', 60.00, 20, 1), ('2025-05-12', 'Tweety', 'Kim Canini', 'Federrupfen', 'Tierarztpraxis Juckstadt', 35.00, 15, 1), ('2025-05-20', 'Luna', 'Dr. Jo Katzner', 'Kastration', 'Tierarztpraxis Juckstadt', 250.00, 90, 2), ('2025-06-03', 'Felix', 'Dr. Mueller', 'Kastration', 'Kleintierpraxis Waldrand', 220.00, 80, 2), ('2025-06-10', 'Minka', 'Dr. Mueller', 'Impfung', 'Kleintierpraxis Waldrand', 40.00, 15, 1), ('2025-06-18', 'Bello', 'Dr. Jo Katzner', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00, 20, 0), -- 2025 Q3 ('2025-07-02', 'Rex', 'Kim Canini', 'Ohrenentzuendung', 'Tierarztpraxis Juckstadt', 65.00, 25, 2), ('2025-07-15', 'Hanni', 'Dr. Mueller', 'Impfung', 'Kleintierpraxis Waldrand', 30.00, 15, 1), ('2025-07-22', 'Sternchen','Dr. Schmidt', 'Lahmheit', 'Pferdepraxis Schmidt', 200.00, 60, 1), ('2025-08-05', 'Bello', 'Dr. Jo Katzner', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), ('2025-08-12', 'Mimi', 'Kim Canini', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 30.00, 15, 0), ('2025-08-20', 'Bruno', 'Dr. Mueller', 'Impfung', 'Kleintierpraxis Waldrand', 45.00, 15, 1), ('2025-09-03', 'Blitz', 'Dr. Schmidt', 'Kolik', 'Pferdepraxis Schmidt', 350.00, 120, 3), ('2025-09-10', 'Luna', 'Dr. Jo Katzner', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), ('2025-09-18', 'Felix', 'Dr. Mueller', 'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00, 15, 0), ('2025-09-25', 'Speedy', 'Dr. Jo Katzner', 'Panzerkontrolle', 'Tierarztpraxis Juckstadt', 55.00, 20, 0), -- 2025 Q4 ('2025-10-06', 'Rex', 'Dr. Jo Katzner', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00, 20, 0), ('2025-10-15', 'Minka', 'Dr. Mueller', 'Entwurmung', 'Kleintierpraxis Waldrand', 25.00, 10, 1), ('2025-10-22', 'Bello', 'Dr. Jo Katzner', 'Ohrenentzuendung', 'Tierarztpraxis Juckstadt', 70.00, 30, 2), ('2025-11-04', 'Sternchen','Dr. Schmidt', 'Routineuntersuchung', 'Pferdepraxis Schmidt', 80.00, 30, 0), ('2025-11-12', 'Hanni', 'Dr. Mueller', 'Kastration', 'Kleintierpraxis Waldrand', 150.00, 60, 2), ('2025-11-20', 'Mimi', 'Kim Canini', 'Katzenschnupfen', 'Tierarztpraxis Juckstadt', 85.00, 30, 2), ('2025-12-02', 'Bruno', 'Dr. Mueller', 'Routineuntersuchung', 'Kleintierpraxis Waldrand', 35.00, 20, 0), ('2025-12-10', 'Blitz', 'Dr. Schmidt', 'Impfung', 'Pferdepraxis Schmidt', 60.00, 20, 1), ('2025-12-18', 'Luna', 'Kim Canini', 'Entwurmung', 'Tierarztpraxis Juckstadt', 25.00, 10, 1), ('2025-12-22', 'Tweety', 'Kim Canini', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 30.00, 15, 0), -- 2026 Q1 ('2026-01-08', 'Bello', 'Dr. Jo Katzner', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), ('2026-01-12', 'Rex', 'Dr. Jo Katzner', 'Bisswunde', 'Tierarztpraxis Juckstadt', 130.00, 50, 2), ('2026-01-20', 'Minka', 'Dr. Mueller', 'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00, 15, 0), ('2026-02-03', 'Felix', 'Dr. Mueller', 'Entwurmung', 'Kleintierpraxis Waldrand', 25.00, 10, 1), ('2026-02-10', 'Sternchen','Dr. Schmidt', 'Knochenbruch', 'Pferdepraxis Schmidt', 450.00, 180, 3), ('2026-02-18', 'Mimi', 'Kim Canini', 'Impfung', 'Tierarztpraxis Juckstadt', 40.00, 15, 1), ('2026-03-05', 'Bello', 'Dr. Jo Katzner', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 35.00, 20, 0), ('2026-03-12', 'Hanni', 'Dr. Mueller', 'Routineuntersuchung', 'Kleintierpraxis Waldrand', 30.00, 15, 0), ('2026-03-20', 'Blitz', 'Dr. Schmidt', 'Lahmheit', 'Pferdepraxis Schmidt', 200.00, 60, 1), ('2026-03-28', 'Luna', 'Dr. Jo Katzner', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), -- 2026 Q2 ('2026-04-05', 'Bruno', 'Dr. Mueller', 'Zahnstein', 'Kleintierpraxis Waldrand', 90.00, 35, 1), ('2026-04-12', 'Rex', 'Kim Canini', 'Impfung', 'Tierarztpraxis Juckstadt', 45.00, 15, 1), ('2026-04-20', 'Speedy', 'Dr. Jo Katzner', 'Panzerkontrolle', 'Tierarztpraxis Juckstadt', 55.00, 20, 0), ('2026-05-05', 'Mimi', 'Kim Canini', 'Entwurmung', 'Tierarztpraxis Juckstadt', 25.00, 10, 1), ('2026-05-12', 'Blitz', 'Dr. Schmidt', 'Routineuntersuchung', 'Pferdepraxis Schmidt', 80.00, 30, 0), ('2026-05-20', 'Minka', 'Dr. Mueller', 'Impfung', 'Kleintierpraxis Waldrand', 40.00, 15, 1), ('2026-06-03', 'Bello', 'Dr. Jo Katzner', 'Tumor-OP', 'Tierarztpraxis Juckstadt', 380.00, 120, 3), ('2026-06-10', 'Felix', 'Dr. Mueller', 'Impfung', 'Kleintierpraxis Waldrand', 40.00, 15, 1), ('2026-06-18', 'Sternchen','Dr. Schmidt', 'Impfung', 'Pferdepraxis Schmidt', 60.00, 20, 1), ('2026-06-25', 'Luna', 'Kim Canini', 'Routineuntersuchung', 'Tierarztpraxis Juckstadt', 30.00, 15, 0) ) AS v(datum, tier, tierarzt, diagnose, praxis, kosten, dauer_min, medikamente) JOIN dim_zeit z ON z.datum = v.datum::DATE JOIN dim_tier t ON t.name = v.tier JOIN dim_tierarzt ta ON ta.name = v.tierarzt JOIN dim_diagnose d ON d.diagnose = v.diagnose JOIN dim_praxis p ON p.name = v.praxis; -- ============================================================ -- Pruefung -- ============================================================ SELECT 'dim_zeit' AS tabelle, COUNT(*) FROM dim_zeit UNION ALL SELECT 'dim_tier', COUNT(*) FROM dim_tier UNION ALL SELECT 'dim_tierarzt', COUNT(*) FROM dim_tierarzt UNION ALL SELECT 'dim_diagnose', COUNT(*) FROM dim_diagnose UNION ALL SELECT 'dim_praxis', COUNT(*) FROM dim_praxis UNION ALL SELECT 'fakt_behandlung', COUNT(*) FROM fakt_behandlung;