SQLScript mit ChatGPT programmieren

Jörg Brandeis

(C) Brandeis Consulting.

Intro

In diesem Vortrag möchte ich zeigen, wie man ChatGPT als Unterstützung für die SQLScript Programmierung nutzen kann. Nebenbei zeige ich, wie man ChatGPT auch zur Erzeugung von Präsentationen verwenden kann. Alle Folien mit weissen Hintergrund sind von mir (Jörg Brandeis) erzeugt.

Promts für ChatGPT sind in blauen Kästchen

Erstelle ein paar Folien in Marp, in denen Du erklärst, wie ChatGPT beim Entwickeln von SQL helfen kann.

Alle schwarzen Folien sind vollständig von ChatGPT erzeugt worden. Ich habe lediglich Kleinigkeiten an der Formatierung optimiert und manche Folien entfernt.

(C) Brandeis Consulting.

Grundlegende SQL-Abfragen schreiben

  • ChatGPT kann grundlegende SQL-Abfragen basierend auf einer Beschreibung erstellen.
  • Beispiel:
    • Beschreibung: "Hole alle Kunden mit einem Umsatz über 10.000."
    • Ergebnis:
SELECT * 
FROM customers
WHERE revenue > 10000;
  • Vorteil: Spart Zeit bei Standardabfragen.
(C) Brandeis Consulting.

Komplexe SQL-Abfragen entwerfen

  • Hilfe bei:
    • Joins (INNER, OUTER, CROSS, etc.)
    • Aggregationen (SUM, AVG, COUNT)
    • Unterabfragen
  • Beispiel:
    • "Erstelle eine Abfrage, die die Top-3-Produkte nach Umsatz je Region liefert."
    • Ergebnis:
SELECT region, product, SUM(revenue) AS total_revenue
FROM sales
GROUP BY region, product
ORDER BY region, total_revenue DESC
LIMIT 3;
(C) Brandeis Consulting.

Optimierung von Abfragen

  • Leistungsoptimierung:
    • Identifizieren ineffizienter Teile einer Abfrage.
    • Vorschläge für Indexnutzung oder Umstrukturierung.
  • Beispiel:
    • Original:
SELECT * FROM orders WHERE MONTH(order_date) = 12;
  • Optimiert:
SELECT * FROM orders
WHERE order_date BETWEEN '2023-12-01' AND '2023-12-31';
(C) Brandeis Consulting.

Erklärung und Debugging

  • SQL verstehen:
    • ChatGPT kann Abfragen erklären, z. B. die Funktion von Joins oder Fensterfunktionen.
  • Debugging:
    • Fehler identifizieren und korrigieren:
ERROR: Column 'customer_id' not found.
  • Lösung:
    • "Überprüfen Sie die Tabelle und stellen Sie sicher, dass die Spalte existiert."
(C) Brandeis Consulting.

SQL für spezifische Systeme (z. B. SAP HANA)

  • Unterstützung bei System-spezifischen SQL-Erweiterungen:
    • SQLScript in SAP HANA
    • PL/pgSQL in PostgreSQL
  • Beispiel (SAP HANA):
    • "Erstelle eine Prozedur zur Berechnung der Umsatzsummen pro Kunde."
      CREATE PROCEDURE CalcRevenue()
      LANGUAGE SQLSCRIPT AS
      BEGIN
          SELECT customer_id, SUM(revenue) AS total_revenue
          INTO TEMP_TABLE
          FROM sales
          GROUP BY customer_id;
      END;
      
(C) Brandeis Consulting.

Schrittweises Entwickeln von Abfragen

  • Zerlegung komplexer Anforderungen in mehrere Schritte:
    • Erstellen von Zwischenergebnissen.
    • Erklärung jedes Schritts.
  • Beispiel:
    1. "Hole alle Kunden mit Umsatzdaten."
    2. "Füge regionale Informationen hinzu."
    3. "Berechne das Umsatzwachstum."
(C) Brandeis Consulting.

Zusammenfassung

  • Was kann ChatGPT für SQL leisten?
    • Schnelle Erstellung von Abfragen.
    • Unterstützung bei komplexen Anforderungen.
    • Fehlerbehebung und Debugging.
    • Optimierung und Verbesserung.
  • Nutzen:
    • Produktivitätssteigerung.
    • Lernen und Verstehen von SQL.
(C) Brandeis Consulting.

1. Schritt bei der Nutzung von ChatGPT bei der Programmierung: Der Kontext

Wenn wir von ChatGPT etwas wollen, dann müssen wir den Kontext so gut wie möglich erklären.

Der Kontext

Ich benötige Unterstützung beim Programmieren in SQL Script auf der HANA Datenbank. Meine Datenbanktabellen sind wie folgt angelegt:

--Definition of data types and database tables
create type id_text as table(
    id int, 
    text nvarchar(20)
);

create column table colors(
	color NVARCHAR(20)
);
create column table sizes(
	size VARCHAR(5)
);
CREATE COLUMN TABLE users(
	id INT PRIMARY KEY,
	firstname NVARCHAR(20),
...
(C) Brandeis Consulting.

Antwort von ChatGPT

Das ist eine sehr solide Basis für eine SQL-Datenbankstruktur auf einer SAP HANA-Datenbank! Mit diesen Tabellen kannst du eine Vielzahl von Operationen durchführen. Du hast eine Mischung aus Entitäten (z. B. users, projects, tasks) und unterstützenden Tabellen (z. B. status, team_text, status_text).

Was möchtest du genau mit diesen Tabellen machen? Hier sind ein paar häufige Szenarien, für die ich dir helfen kann:

  1. Einfügen von Daten: Möchtest du Beispieldaten in die Tabellen einfügen?
  2. Abfragen erstellen: Brauchst du Unterstützung bei der Erstellung von SQL-Abfragen? Beispiele:
    • Projektdetails mit zugewiesenen Aufgaben abrufen.
    • Alle Benutzer mit offenen Aufgaben anzeigen.
    • Einen Bericht über abgeschlossene Aufgaben generieren.
  3. Berichte generieren: Eine SQL-Script-Prozedur schreiben, um Berichte zu erstellen.
  4. Trigger oder Stored Procedures: Soll ein Ereignis automatisch eine Aktion auslösen (z. B. beim Einfügen in tasks_log)?
  5. Fehlerprotokollierung: Fehlerhandling in error_log automatisieren.

Teile mir mit, was du konkret benötigst, und ich helfe dir gerne! 😊

(C) Brandeis Consulting.

2. Schritt: Eine Aufgabe

Die Aufgabe

Bitte erstelle eine Abfrage, bei der alle Aufgaben mit den Feldern ID, STATUS, TITEL selektiert werden. Dazu hätte ich gerne die Vor- und Nachnamen von den Bearbeitern und von den jeweiligen Projektleitern.

(C) Brandeis Consulting.

Antwort von ChatGPT

SELECT 
    t.id AS task_id,
    t.status AS task_status,
    t.title AS task_title,
    assignee_user.firstname AS assignee_firstname,
    assignee_user.lastname AS assignee_lastname,
    project_manager_user.firstname AS project_manager_firstname,
    project_manager_user.lastname AS project_manager_lastname
FROM 
    tasks t
LEFT JOIN 
    users assignee_user ON t.assignee = assignee_user.id
LEFT JOIN 
    projects p ON t.project = p.id
LEFT JOIN 
    users project_manager_user ON p.project_manager = project_manager_user.id;

(C) Brandeis Consulting.

3. Schritt: Die Optimierung

Die Aufgabe

Bitte passe das Ergebnis wie folgt an:

  • Die Tabellen-Aliase sollen mit AS deklariert werden
  • Die Ausrichtung der Feld-Alias Namen sollen untereinander sein
  • Die Alias-Namen sollen im Pascal-Case geschrieben sein
  • Alle optionalen Schlüsselwörter sollen ausgeschrieben werden.
(C) Brandeis Consulting.

Ergebnis der optimierten Abfrage

SELECT 
    t.id                          AS TaskId,
    t.status                      AS TaskStatus,
    t.title                       AS TaskTitle,
    assignee_user.firstname       AS AssigneeFirstname,
    assignee_user.lastname        AS AssigneeLastname,
    project_manager_user.firstname AS ProjectManagerFirstname,
    project_manager_user.lastname AS ProjectManagerLastname
FROM 
    tasks AS t
LEFT OUTER JOIN 
    users AS assignee_user 
    ON t.assignee = assignee_user.id
LEFT OUTER JOIN 
    projects AS p 
    ON t.project = p.id
LEFT OUTER JOIN 
    users AS project_manager_user 
    ON p.project_manager = project_manager_user.id;

(C) Brandeis Consulting.

Nächster Test: Beispieldaten

Erzeuge ein paar Beispiel-Daten für die USERS Tabelle. Im Markdown-Format.

(C) Brandeis Consulting.

Ergebnis: Beispieldaten

Hier sind einige Beispiel-Daten für die USERS-Tabelle im Markdown-Format:

ID Firstname Lastname Email Sex Team
1 John Doe john.doe@example.com M 101
2 Jane Smith jane.smith@example.com F 102
3 Alice Johnson alice.johnson@example.com F 101
4 Bob Brown bob.brown@example.com M 103
5 Carol Taylor carol.taylor@example.com F 104
6 David Wilson david.wilson@example.com M 102
7 Emily Davis emily.davis@example.com F 103
8 Frank Miller frank.miller@example.com M 104
9 Grace Martinez grace.martinez@example.com F 101
10 Henry Lee henry.lee@example.com M 102

Falls du spezifische Teams, Geschlechter oder weitere Details in den Daten möchtest, lass es mich wissen, und ich passe die Daten entsprechend an! 😊

(C) Brandeis Consulting.

Refactoring mit ChatGPT

Im Folgenden kommen konkrete Beispiele, was wir mit ChatGPT für bestehenden Code alles machen können.

(C) Brandeis Consulting.

Erklär mir mal...

Kannst Du mir erklären, was der folgende Code macht. Bitte erzeuge mir aus dem Ergebnis MARP Folien:
[Hier kommen jetzt 1500 Zeilen Code aus der AMDP Transformation]

Hier ist die überarbeitete Version der MARP-Präsentation mit einfachen Überschriften der ersten Ebene und ohne Hervorhebungen:

(C) Brandeis Consulting.

Analyse des SQLScript-Codes - Überblick

  • Komplexität: Verarbeitung mehrerer Datenquellen und Transformationen.
  • Ziel: Erstellung einer konsolidierten Datenstruktur (OUTTAB) für Bestellungen, Positionen, Preise, Mengen und Rechnungen.
(C) Brandeis Consulting.

Überblick über die Schritte

  1. Positionen (Grunddaten)

    • Extrahiert Bestelldaten und Positionen.
    • Berechnet Währungskurse und Zusatzdaten wie Transportdauer.
  2. Preisfindung

    • Aggregiert Preisbestandteile (z. B. Seefracht, Zoll).
    • Verwendet Währungskonversionen.
  3. Vertragsstrafen

    • Bestimmt Vertragsstrafenregeln und Stufen.
  4. Lieferung und Wareneingang

    • Berechnet geplante und tatsächliche Mengen und Daten.
(C) Brandeis Consulting.

Details zu POSITIONEN

  • Quelle: Tabelle :INTAB und andere.
  • Funktionen:
    • Extrahiert Attribute wie:
      • Bestellnummer, Position, Artikel, Lieferant.
    • Berechnungen:
      • Währungskurse (ABS(A.WKURS)).
      • Transportdauer über Unterabfragen.

Beispiel:

ROUND(B.NETWR * CASE WHEN A.WKURS >= 0 THEN A.WKURS ELSE -1/A.WKURS END, 2)
(C) Brandeis Consulting.

Details zur PREISFINDUNG

  • Ziel: Aggregation von Preisbestandteilen.
  • Bedingungen:
    • Unterscheidet nach Preisarten (z. B. SEEFRACHT, ZOLL).
    • Berücksichtigt Währungskonversion:
      CASE WHEN A.WAEHRUNGSKURS_INVERS = '0' THEN A.WAEHRUNGSKURS ELSE 1/A.WAEHRUNGSKURS END
      
  • Berechnungen:
    • Summen und gerundete Werte für diverse Kostenkategorien.
(C) Brandeis Consulting.

Verarbeitung von Vertragsstrafen

  1. Vertragsstrafenkonditionen

    • Bestimmt die Regelbasis (z. B. Ableitungsregeln).
    • Nutzt Tabellen wie /BIC/AEAMMIMM032.
  2. Vertragsstrafenstufen

    • Ordnet Verzugszeiten zu Vertragsstrafenprozentsätzen.
(C) Brandeis Consulting.

Lieferungen und Wareneingänge

  • EINTEILUNGEN:
    • Berechnet geplante Mengen und Daten:
      SUM(B.MENGE) OVER (PARTITION BY A.BESTELLUNG, A.BESTELLPOSITION)
      
  • WARENEINGANG:
    • Verarbeitet tatsächliche Eingänge und deren Beträge.
    • Summiert Mengen und bewertet Soll-Haben-Logik.
(C) Brandeis Consulting.

Rechnungen und Warenausgänge

  1. Rechnungen

    • Plant und analysiert Nebenkosten (z. B. geplante/ungeplante Seefracht).
  2. Warenausgang

    • Verfolgt ausgehende Mengen und berechnet deren kumulierten Werte.
(C) Brandeis Consulting.

Stücklisten und Konsolidierung

  1. Stücklisten

    • Verarbeitet Artikelstrukturen (z. B. Baugruppen).
    • Berechnet Mengen basierend auf der Struktur.
  2. OUTTAB

    • Konsolidiert alle Daten in einer Ausgabe.
    • Enthält Spalten wie:
      • Bestellmenge (/BIC/YIMBEMNG).
      • Wareneingangswerte (/BIC/YIMWEBTR).
(C) Brandeis Consulting.

Zusammenfassung

Highlights:

  • Modularität: Aufteilung in klar definierte Schritte.
  • Komplexität: Integration von Währungsberechnungen, Vertragsstrafen, Stücklisten.
  • Effizienz: Verwendung von Window-Funktionen und aggregierten Berechnungen.

Nutzen:

  • Bietet eine vollständige Übersicht über Bestellungen, Kosten, und Mengen.
  • Unterstützung komplexer Geschäftsanforderungen.
(C) Brandeis Consulting.

Feldnamen optimieren

kannst du bitte für diese Feldliste im SQL schöne englische Alias-Namen im Pascal-Case mit AS hinzufügen:

    Items =
        SELECT
            EBELN,
            EBELP,
            BSART,
            LIFNR,
            EKGRP,
            WAERS,
            BEDAT,
            PROCSTAT,
            EMATN,
            WERKS,
            MEINS,
            INCO2L,
            INCO1,
            BANFN,
            BNFPO,
            LPRIO,
            KNUMV
Items =
    SELECT
        EBELN    AS PurchaseOrderNumber,
        EBELP    AS PurchaseOrderItem,
        BSART    AS DocumentType,
        LIFNR    AS VendorNumber,
        EKGRP    AS PurchasingGroup,
        WAERS    AS Currency,
        BEDAT    AS DocumentDate,
        PROCSTAT AS ProcessingStatus,
        EMATN    AS MaterialNumber,
        WERKS    AS Plant,
        MEINS    AS UnitOfMeasure,
        INCO2L   AS IncotermsLocation,
        INCO1    AS Incoterms,
        BANFN    AS PurchaseRequisitionNumber,
        BNFPO    AS PurchaseRequisitionItem,
        LPRIO    AS DeliveryPriority,
        KNUMV    AS ConditionRecordNumber
(C) Brandeis Consulting.

Gemeinsame Teilausdrücke

Finde in der folgenden Abfrage gemeinsame Teilausdrücke, die wir in einem vorherigen Schritt berechnen können. Bitte gib auch an, wie oft diese Teilaudrücke vorkommen.

[Eine Abfrage mit ca. 100 Zeilen]

(C) Brandeis Consulting.

Ergebnis Gemeinsame Teilausdrücke

In den beiden SQL-Abfragen gibt es mehrere gemeinsame Teilausdrücke, die mehrfach berechnet werden und in einem vorherigen Schritt berechnet und wiederverwendet werden könnten. Dies optimiert die Performance und Lesbarkeit des Codes.

(C) Brandeis Consulting.

1. Gemeinsame Teilausdrücke in der POSITIONEN-Abfrage

a) Währungsumrechnung

Der Ausdruck zur Berechnung der Währungsumrechnung wird mehrfach verwendet:

CASE WHEN A.WKURS >= 0 THEN TO_DECIMAL(A.WKURS) ELSE TO_DECIMAL(-1)/A.WKURS END
  • Vorkommen:
    • NETTOBESTELLWERT
    • AKTIVIERUNGSWERT
    • EINKAUFSPREIS_ZL
    • EINKAUFSPREIS_BM
  • Optimierung: Dies kann als berechnete Spalte oder als CTE (Common Table Expression) definiert werden, z. B.:
    CALCULATED_WAEHRUNGSKURS AS (
        SELECT CASE WHEN A.WKURS >= 0 THEN TO_DECIMAL(A.WKURS) ELSE TO_DECIMAL(-1)/A.WKURS END AS WAEHRUNGSKURS_BERECHNET
        FROM :INTAB A
    )
    
(C) Brandeis Consulting.

b) Transportdauer-Abfragen

Es gibt zwei ähnliche Unterabfragen für die Transportdauer:

SELECT COALESCE(TO_INT(MIN(T.TPTS)),0) ...
SELECT COALESCE(TO_INT(MIN(T.TPTL)),0) ...

Beide greifen auf dieselbe Tabelle "/BIC/AEAMMIMT012" zu und haben ähnliche Bedingungen:

  • T.INCO2L=B.INCO2L
  • T.INCO3L=B.INCO3L
  • A.BEDAT BETWEEN T.DATAB AND T.DATBI
  • Vorkommen:
    • TRANSPORTDAUER_SEE
    • TRANSPORTDAUER_LAND
  • Optimierung: Eine gemeinsame Abfrage könnte definiert werden, die beide Werte berechnet:
    TRANSPORTDAUER AS (
        SELECT B.INCO2L, B.INCO3L, 
               MIN(T.TPTS) AS TRANSPORTDAUER_SEE,
               MIN(T.TPTL) AS TRANSPORTDAUER_LAND
        FROM "/BIC/AEAMMIMT012" T
        JOIN :POSITIONEN B ON T.INCO2L=B.INCO2L AND T.INCO3L=B.INCO3L
        WHERE A.BEDAT BETWEEN T.DATAB AND T.DATBI
        GROUP BY B.INCO2L, B.INCO3L
    )
    
(C) Brandeis Consulting.

2. Gemeinsame Teilausdrücke in der PREISFINDUNG-Abfrage

a) Währungsumrechnung

Der gleiche Währungsumrechnungs-Ausdruck wie in der POSITIONEN-Abfrage wird hier ebenfalls mehrfach verwendet:

CASE WHEN A.WAEHRUNGSKURS_INVERS = '0' THEN TO_DECIMAL(A.WAEHRUNGSKURS) ELSE TO_DECIMAL(1)/A.WAEHRUNGSKURS END
  • Vorkommen:
    • SEEFRACHT
    • HEAVY_WEIGHT
    • ZOLL
    • THC
    • Weitere Spalten (insgesamt 21 Spalten)
(C) Brandeis Consulting.

b) Bedingte Summen

Die bedingten Summenberechnungen verwenden häufig den Ausdruck CASE WHEN B.KSCHL='<SOME_VALUE>' THEN B.KWERT END:

  • Vorkommen:
    • SEEFRACHT
    • HEAVY_WEIGHT
    • ZOLL
    • ... (alle 21 Spalten)
  • Optimierung: Erstelle eine Zwischentabelle oder ein CTE, das die aggregierten Werte je KSCHL bereitstellt:
    AGGREGIERTE_KOSTEN AS (
        SELECT A.BESTELLUNG, A.BESTELLPOSITION, B.KSCHL,
               SUM(B.KWERT) AS SUM_KWERT
        FROM :POSITIONEN A
        JOIN "/BIC/AEAMMIMT042" B
        ON B.KNUMV = A.BELEGKONDITION
        AND B.KPOSN = LPAD(A.BESTELLPOSITION,6,'0')
        GROUP BY A.BESTELLUNG, A.BESTELLPOSITION, B.KSCHL
    )
    
(C) Brandeis Consulting.

Zusammenfassung

Hier sind die identifizierten Teilausdrücke und ihre Häufigkeiten:

  1. Währungsumrechnung:
    • Abfrage POSITIONEN: 4 Vorkommen
    • Abfrage PREISFINDUNG: 21 Vorkommen
    • Optimierung: Gemeinsames Berechnungsergebnis für Währungsumrechnung.
  2. Transportdauer:
    • Abfrage POSITIONEN: 2 Vorkommen
    • Optimierung: Eine konsolidierte Abfrage für TRANSPORTDAUER_SEE und TRANSPORTDAUER_LAND.
  3. Bedingte Summen (nach KSCHL):
    • Abfrage PREISFINDUNG: 21 Vorkommen
    • Optimierung: Voraggregierte Tabelle für Summen je KSCHL.

Durch die Verwendung von berechneten Spalten, CTEs oder Zwischentabellen kann die Redundanz reduziert und die Abfrageleistung verbessert werden.

(C) Brandeis Consulting.

Fazit & Warnung

  • ChatGPT kann uns in vielen Bereichen unterstützen. Gerade für die Fleisarbeit ist es nützlich.
  • Einen Entwickler kann es bislang nicht ersetzten, denn
    • Jemand muss wissen, wo man hin will
    • Es gibt zu viele Probleme mit der Technik. Beispielsweise wird teilweise nicht lauffähiger Code erzeugt.
  • Große Abfragen uns Script können zwar gelesen werden, aber beim Refactoring wird oft nur ein Teil ausgegeben.
  • Der Kontext ist wichtig. Manchmal bekommen wir Ergebnisse, die auf anderen Datenbanksystemen funktionieren.
  • ChatGPT fantasiert auch manchmal.
(C) Brandeis Consulting.