Aufgaben-Python/courses/sql/16_master_abschlussprojekt_data_warehouse/test_aufgabe.sql

81 lines
2.8 KiB
SQL

-- ============================================================================
-- 🧪 TESTSUITE FÜR SQL 16: MASTER DATA WAREHOUSE & ANALYTICS 🧪
-- ============================================================================
-- Test 1: Dimensions- und Faktencheck
SELECT
'TEST 1 (Warehouse Schema Validierung)' AS test_fall,
(SELECT COUNT(*) FROM dim_customers) AS kunden_count,
(SELECT COUNT(*) FROM dim_products) AS produkte_count,
(SELECT COUNT(*) FROM fact_orders) AS orders_count;
-- Test 2: Kohorten-Matrix Retention Test (TODO 2)
WITH kunden_kohorte AS (
SELECT customer_key, strftime('%Y-%m', MIN(order_date)) AS kohorte FROM fact_orders GROUP BY customer_key
),
kunden_aktivitaet AS (
SELECT DISTINCT fo.customer_key, kk.kohorte, strftime('%Y-%m', fo.order_date) AS aktivitaets_monat
FROM fact_orders fo JOIN kunden_kohorte kk ON fo.customer_key = kk.customer_key
),
kohorten_basis AS (
SELECT kohorte, COUNT(DISTINCT customer_key) AS kohorten_groesse FROM kunden_kohorte GROUP BY kohorte
)
SELECT
'TEST 2 (Kohorten Retention)' AS test_fall,
ka.kohorte,
ka.aktivitaets_monat,
COUNT(DISTINCT ka.customer_key) AS active_users,
kb.kohorten_groesse,
ROUND(COUNT(DISTINCT ka.customer_key) * 100.0 / kb.kohorten_groesse, 1) AS retention_pct
FROM kunden_aktivitaet ka
JOIN kohorten_basis kb ON ka.kohorte = kb.kohorte
GROUP BY ka.kohorte, ka.aktivitaets_monat, kb.kohorten_groesse
ORDER BY ka.kohorte ASC, ka.aktivitaets_monat ASC;
-- Test 3: RFM-Segmentierungs Test (TODO 3)
WITH rfm_raw AS (
SELECT
fo.customer_key,
c.name AS kunden_name,
CAST(julianday('2024-04-30') - julianday(MAX(fo.order_date)) AS INTEGER) AS recency_tage,
COUNT(fo.order_key) AS frequency,
SUM(fo.total_amount) AS monetary
FROM fact_orders fo
JOIN dim_customers c ON fo.customer_key = c.customer_key
GROUP BY fo.customer_key, c.name
),
rfm_scored AS (
SELECT
customer_key,
kunden_name,
monetary,
NTILE(4) OVER (ORDER BY recency_tage DESC) AS r_score,
NTILE(4) OVER (ORDER BY frequency ASC) AS f_score,
NTILE(4) OVER (ORDER BY monetary ASC) AS m_score
FROM rfm_raw
)
SELECT
'TEST 3 (RFM Segmentierung)' AS test_fall,
customer_key,
kunden_name,
monetary,
CASE
WHEN r_score >= 3 AND f_score >= 3 AND m_score >= 3 THEN 'Champions'
WHEN f_score >= 3 THEN 'Loyal Customers'
WHEN r_score <= 2 AND f_score >= 2 THEN 'At Risk'
ELSE 'Potential / Hibernating'
END AS kunden_segment
FROM rfm_scored
ORDER BY monetary DESC;
-- Test 4: Executive KPI Dashboard View (TODO 4)
SELECT
'TEST 4 (Executive BI View)' AS test_fall,
monat,
monats_umsatz,
anzahl_bestellungen,
aktive_kunden,
aov,
kumulierter_allzeit_umsatz
FROM v_executive_kpi_dashboard
ORDER BY monat ASC;