SQL-Abfrage erstellen aus einer Frage in normalen Worten
Du weißt, welche Zahl du brauchst, „die 10 umsatzstärksten Kunden der letzten 90 Tage“, aber nicht mehr genau, wie JOIN, GROUP BY und Datumsfunktionen in deinem Datenbanksystem aussehen. Dein todo.is-Agent schreibt die SQL-Abfrage, kommentiert jeden Teil, testet sie an passenden Beispieldaten und sagt dir, welche Annahmen er getroffen hat.
Der Prompt
- Schreib eine SQL-Abfrage für [DATENBANKSYSTEM], die folgende Frage beantwortet: [DEINE FRAGE]. Meine Tabellen: [TABELLENSTRUKTUR]. Kommentier jeden Teil, nutze verständliche Aliasse und vermeide alles, was bei [TABELLENGRÖSSE] langsam wäre. Erstelle einen kleinen Beispieldatensatz, der zu meinen Tabellen passt, führ die Abfrage in deinem Arbeitsbereich darauf aus und zeig mir das Ergebnis, damit ich sehe, dass sie funktioniert. Ist an meiner Frage etwas mehrdeutig (etwa wie Rückerstattungen zählen), sag mir, was du angenommen hast. Kommentare bitte auf Deutsch.
Was du ändern solltest
- [DATENBANKSYSTEM]: Z. B. „PostgreSQL 15“, „MySQL 8“, „SQL Server“, „SQLite“, „BigQuery“ oder „Snowflake“.
- [DEINE FRAGE]: In normalen Worten, z. B. „die 10 umsatzstärksten Kunden der letzten 90 Tage mit Anzahl der Bestellungen“.
- [TABELLENSTRUKTUR]: CREATE-TABLE-Anweisungen einfügen oder Tabellen und Spalten auflisten, z. B. „orders(id, customer_id, total, status, created_at)“. Oder eine Schema-Datei anhängen.
- [TABELLENGRÖSSE]: Grobe Zeilenzahl, z. B. „orders hat 20 Millionen Zeilen“ oder „klein, unter 100.000 Zeilen“.
Beispielergebnis
- Top 10 Kunden nach Umsatz, letzte 90 Tage (PostgreSQL)
- -- Bezahlte Bestellungen der letzten 90 Tage, abzüglich Erstattungen
- WITH recent AS (
- SELECT o.customer_id,
- o.id AS order_id,
- o.total - COALESCE(r.amount, 0) AS net_total
- FROM orders o
- LEFT JOIN refunds r ON r.order_id = o.id -- auch Bestellungen ohne Erstattung behalten
- WHERE o.status = 'paid'
- AND o.created_at >= now() - interval '90 days'
- )
- SELECT c.id,
- c.name,
- COUNT(*) AS bestellungen,
- SUM(rc.net_total) AS umsatz
- FROM recent rc
- JOIN customers c ON c.id = rc.customer_id
- GROUP BY c.id, c.name
- ORDER BY umsatz DESC
- LIMIT 10;
- Was die einzelnen Teile tun
- • WITH recent AS (…) sammelt zuerst die relevanten Bestellungen, damit die Hauptabfrage lesbar bleibt
- • LEFT JOIN refunds behält auch Bestellungen ohne Erstattung; COALESCE macht aus der fehlenden Erstattung eine 0
- • GROUP BY c.id, c.name ergibt eine Zeile pro Kunde; die Gruppierung nach id verhindert, dass zwei Kunden mit gleichem Namen zusammenfallen
- • ORDER BY umsatz DESC LIMIT 10 behält die Top 10
- Testlauf (500 erfundene Bestellungen, 60 Kunden)
- • 1. Nordwind Fahrräder: 14 Bestellungen, 8.920,00
- • 2. Wacholder Studio: 9 Bestellungen, 7.410,50
- • 3. Erle & Fink: 11 Bestellungen, 6.985,00
- Annahmen
- • „Umsatz“ heißt bezahlte Bestellungen minus Erstattungen; offene und stornierte Bestellungen sind ausgeschlossen
- • Höchstens eine Erstattung pro Bestellung. Sind mehrere möglich, müssen die Erstattungen vorher pro Bestellung summiert werden
- Performance bei 20 Mio. Zeilen
- • Ein Index auf orders (status, created_at) lässt die WHERE-Bedingung alte Zeilen überspringen
- • Vor dem Einsatz in einem Dashboard EXPLAIN ANALYZE laufen lassen
- • In SQL Server heißt es TOP 10 statt LIMIT 10, in MySQL INTERVAL 90 DAY
So geht’s mit todo.is
- Kopiere den Prompt, nenn dein Datenbanksystem und formulier deine Frage so, wie du sie einer Kollegin stellen würdest.
- Füg die Tabellenstruktur ein oder häng das Schema an und schick alles in todo.is oder per Telegram an deinen Agenten.
- Dein Agent schreibt die Abfrage, testet sie an Beispieldaten und schickt dir die .sql-Datei mit Erklärung.
- Frag nach, z. B. „und jetzt nur Kunden aus Österreich“ oder „schreib es für MySQL um“.
Tipps für ein besseres Ergebnis
- Nenn immer dein Datenbanksystem. Datumsfunktionen, LIMIT oder TOP und Textfunktionen unterscheiden sich zwischen PostgreSQL, MySQL, SQL Server und BigQuery.
- Teile die Struktur, nicht die Daten. Spaltennamen und Datentypen reichen für eine korrekte Abfrage, und personenbezogene Daten bleiben bei dir.
- Definiere schwammige Begriffe wie „aktiver Kunde“ oder „Umsatz“ in deiner Frage. Die meisten falschen Zahlen entstehen durch unklare Definitionen.
- Teste neue Abfragen mit einem Nur-Lese-Benutzer oder an einer Kopie der Datenbank, bevor du UPDATE oder DELETE ausführst.
SQL-Abfrage erstellen: häufige Fragen
- Kann sich der Agent mit meiner Datenbank verbinden? Nein. Er meldet sich nicht bei deiner Datenbank an. Er testet die Abfrage an Beispieldaten in seinem eigenen Arbeitsbereich, die endgültige Abfrage führst du in deinem eigenen Tool aus.
- Was ist der Unterschied zwischen WHERE und HAVING? WHERE filtert Zeilen vor dem Gruppieren, HAVING filtert Gruppen nach der Aggregation. HAVING COUNT(*) > 5 behält zum Beispiel nur Kunden mit mehr als 5 Bestellungen.
- Kann er eine langsame Abfrage erklären und beschleunigen? Ja. Füg die Abfrage und, wenn möglich, die EXPLAIN-Ausgabe ein. Er zeigt fehlende Indizes, unnötige Unterabfragen oder Funktionen auf indizierten Spalten und schreibt sie um.
- Ist es sicher, mein Schema einzufügen? Dein Schema bleibt in deinem eigenen Agenten-Arbeitsbereich, nur dein Agent nutzt es. Echte Daten und Zugangsdaten lässt du weg, sie werden nicht gebraucht.
JavaScript is required to use the todo.is app.