239 lines
13 KiB
SQL
239 lines
13 KiB
SQL
-- ============================================================
|
|
-- 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;
|