Analytische Berichte sind systematisierte Datenansichten, die bei Entscheidungen helfen. Zum Beispiel:
- Manager wollen sehen, wie hoch der Umsatz im letzten Monat war.
- Analysten suchen nach Trends auf dem Markt.
- Entwickler überwachen die Performance der Anwendung.
Stell dir vor, du bist ein Chefkoch, der ein riesiges Restaurant leitet. Um zu verstehen, welche Gerichte am häufigsten bestellt werden, brauchst du einen Bericht. PostgreSQL ist in diesem Fall deine Datenbank für Rezepte und Bestellungen, und PL/pgSQL (Prozeduren) ist dein Küchenhelfer, der den Analyseprozess der Bestellungen automatisiert.
Grundlagen der Erstellung analytischer Berichte
Ein analytischer Bericht ist ein Tool zum Aggregieren, Filtern, Sortieren und Ordnen von Daten, um nützliche Infos zu bekommen. Normalerweise besteht der Aufbau eines Berichts aus folgenden Schritten:
- Datenvorbereitung: Auswahl von Infos aus Tabellen, Filtern und Vorverarbeitung.
- Datenaggregation: Berechnung von Metriken (durchschnittlicher Warenkorb, Gesamtsumme der Verkäufe usw.).
- Formatierung: Daten in eine gut lesbare Form bringen.
- Ausgabe der Ergebnisse: Bericht den Usern zeigen oder in einer Tabelle speichern.
Jeder dieser Schritte kann mit PL/pgSQL-Prozeduren umgesetzt werden.
Prozedur für einen analytischen Bericht erstellen
Schauen wir uns ein einfaches Beispiel für einen analytischen Bericht an. Angenommen, wir haben eine Tabelle orders, in der Bestelldaten gespeichert sind:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount NUMERIC(10, 2)
);
Unsere Aufgabe: Einen Bericht über die Verkaufssumme für einen bestimmten Monat erstellen. Also wollen wir sehen:
- Monat.
- Gesamtsumme der Verkäufe für diesen Monat.
Aufbau der Prozedur
Hier ist unser Plan für die Prozedur (keine Angst, PL/pgSQL-Programmierung ist harmlos):
- Einen Eingabeparameter entgegennehmen – den Monat.
- Daten für diesen Monat aus der Tabelle
ordersauswählen. - Gesamtsumme der Verkäufe berechnen.
- Das Ergebnis zurückgeben.
Implementierung der Prozedur
Beispielcode:
CREATE OR REPLACE FUNCTION monthly_sales_report(p_month DATE)
RETURNS TABLE (
month DATE,
total_sales NUMERIC(10, 2)
) AS $$
BEGIN
-- Daten für den angegebenen Monat auswählen und aggregieren
RETURN QUERY
SELECT
DATE_TRUNC('month', o.order_date) AS month,
SUM(o.total_amount) AS total_sales
FROM orders o
WHERE DATE_TRUNC('month', o.order_date) = DATE_TRUNC('month', p_month)
GROUP BY 1;
END;
$$ LANGUAGE plpgsql;
- Eingabeparameter:
p_month– ein Datum. Damit filtern wir die Daten nach Monat. - RETURN QUERY: Das ist die magische Sache, mit der du Daten direkt aus der Prozedur zurückgeben kannst.
- DATE_TRUNC: Wird genutzt, um
order_dateauf den Monatsanfang zu runden. - SUM: Aggregatfunktion, um die Summe aller Bestellungen zu berechnen.
- GROUP BY: Gruppiert die Daten nach Monat, weil die Berichte monatlich sind.
Jetzt können wir unsere Funktion aufrufen:
SELECT * FROM monthly_sales_report('2023-08-01');
Und wir bekommen sowas wie:
| month | total_sales |
|---|---|
| 2023-08-01 | 50000.00 |
Diese Funktion ist die Basis. Lass uns das Ganze schwieriger machen!
Einen komplexeren Bericht erstellen
Jetzt stell dir vor, wir wollen die Verkäufe nach Kunden aufschlüsseln. Unser Bericht soll also zeigen:
- Kunde
- Monat
- Summe der Bestellungen dieses Kunden im Monat
Wir ändern die Prozedur
CREATE OR REPLACE FUNCTION customer_monthly_report(p_month DATE)
RETURNS TABLE (
customer_id INT,
month DATE,
total_sales NUMERIC(10, 2)
) AS $$
BEGIN
RETURN QUERY
SELECT
o.customer_id,
DATE_TRUNC('month', o.order_date) AS month,
SUM(o.total_amount) AS total_sales
FROM orders o
WHERE DATE_TRUNC('month', o.order_date) = DATE_TRUNC('month', p_month)
GROUP BY o.customer_id, DATE_TRUNC('month', o.order_date);
END;
$$ LANGUAGE plpgsql;
Jetzt rufen wir die Prozedur so auf:
SELECT * FROM customer_monthly_report('2023-08-01');
Und das Ergebnis könnte so aussehen:
| customer_id | month | total_sales |
|---|---|---|
| 101 | 2023-08-01 | 20000.00 |
| 102 | 2023-08-01 | 30000.00 |
Temporäre Tabellen verwenden
Manchmal ist es beim Erstellen komplexer Berichte praktisch, temporäre Tabellen zu nutzen. Zum Beispiel, wenn du Zwischenergebnisse verarbeiten willst.
CREATE OR REPLACE FUNCTION temp_table_example(p_month DATE)
RETURNS VOID AS $$
BEGIN
-- Temporäre Tabelle erstellen
CREATE TEMP TABLE temp_sales AS
SELECT
customer_id,
DATE_TRUNC('month', order_date) AS month,
SUM(total_amount) AS total_sales
FROM orders
WHERE DATE_TRUNC('month', order_date) = DATE_TRUNC('month', p_month)
GROUP BY customer_id, DATE_TRUNC('month', order_date);
-- Zusätzliche Berechnungen oder Manipulationen mit dieser Tabelle machen
-- Zum Beispiel die Top-3-Kunden nach Bestellsumme anzeigen
RAISE NOTICE 'Top-3 Kunden für Monat %:', p_month;
FOR record IN
SELECT customer_id, total_sales
FROM temp_sales
ORDER BY total_sales DESC
LIMIT 3
LOOP
RAISE NOTICE 'Kunde: %, Summe: %', record.customer_id, record.total_sales;
END LOOP;
END;
$$ LANGUAGE plpgsql;
In diesem Fall wird die temporäre Tabelle temp_sales genutzt, um Zwischenergebnisse zu speichern.
Nützliche Tipps
- Optimierung: Nutze Indizes, um Datenabfragen zu beschleunigen.
- Division-durch-Null-Fehler: Prüfe immer den Divisor, damit dein Bericht nicht "abstürzt".
- Datumsformatierung: Nutze Funktionen wie
TO_CHARfür eine schöne Ausgabe.
Ich hoffe, du bist nicht zu sehr eingeschlafen! Es kommen noch schwierigere und spannendere Aufgaben, also bleib dran!
GO TO FULL VERSION