EU-Vergabedaten: ein BI-Produkt von Anfang bis Ende
Echte öffentliche Ausschreibungsdaten, konsequent zu Ende gedacht: uneinheitliche Quellsysteme, ein Data Vault für die Entitätsauflösung, dimensionale Marts und ein Semantikmodell, das seine Abdeckung und Datenintegrität gemeinsam mit den Kennzahlen veröffentlicht. Jede Kennzahl wird schriftlich definiert, bevor eine Zeile DAX entsteht, und Regressionstests fixieren jede auf einen bekannten Filterkontext.
Fallstudie lesen
Drei Zahlen sahen einwandfrei aus und waren falsch. Sie zu finden ist die eigentliche Arbeit; die Pipeline dahinter ist Standardware. Hier steht, worin jeder Fehler bestand, wie er ans Licht kam und was die fertigen Zahlen trotzdem nicht aussagen können.
Ein Anteil, der nur null sein konnte
Der Rahmenvertragsanteil wurde zunächst am zertifizierten Wert gemessen — also an der Summe, die alle Zuschläge ausschließt, die an den Qualitätsregeln der Datenschicht scheitern. Jeder Rahmenvertragszuschlag scheitert an genau diesen Regeln, denn die uneindeutige Behandlung von Rahmenverträgen ist der Grund, weshalb sich ein Wert nicht zertifizieren lässt. Die Kennzahl lieferte deshalb in jedem Filterkontext dauerhaft 0 % — als saubere, selbstbewusste Null.
Gemessen an der Summe einschließlich nicht verifizierter Werte, in der Rahmenvertragszuschläge tatsächlich enthalten sind, liegt sie bei 45,7 %. Der Fehler steckte nicht im DAX, sondern in der Wahl der Bezugsgröße — die Art von Fehler, die keine Syntaxprüfung sieht.
Eine Haushaltssumme, die Einnahmen zu Ausgaben addierte
Die Datei zum Bundeshaushalt enthält beide Hälften des Haushalts. Ein Haushalt ist ausgeglichen, also ergibt die Summe aller Zeilen etwa das Doppelte: 993 Mrd. € gegenüber einem tatsächlichen Bundeshaushalt 2022 von 495,8 Mrd. € — eine Zahl, die auf einer Kachel völlig plausibel aussähe.
Die erste Ziffer des Gruppierungsplans trennt beide: Gruppen 0–3 sind Einnahmen und Finanzierung, Gruppen 4–9 sind Ausgaben. Jede Hälfte stimmt für das Haushaltsjahr 2022 nun mit 495,79 Mrd. € gegen den veröffentlichten Haushalt ab. Die Klassifikation begann als berechnete Spalte im Semantikmodell und liegt inzwischen im Warehouse, wo sie aus der Quelle abgeleitet ist und jeder Verbraucher sie erbt, statt sie erneut herzuleiten.
Eine Quote, die einen Ausschnitt durch einen anderen teilte
Der Rahmenvertragsanteil filtert dieselbe Spalte, nach der Lesende ebenfalls filtern können. Ohne KEEPFILTERS ersetzt der innere Filter der Kennzahl den Filter der Lesenden, statt ihn einzugrenzen. Auf Nicht-Rahmenverträge gefiltert lieferte sie 84 % — Rahmenvertragswert geteilt durch Nicht-Rahmenvertragswert. Kein Fehler und kein Leerwert: ein plausibler Prozentsatz ohne jede Bedeutung.
Jede Quote im Modell umschließt ihren Zählerfilter inzwischen mit KEEPFILTERS, und zu jeder gehört ein Test, der das korrekte Verhalten beim Filtern nach der gefilterten Spalte prüft. Die meisten DAX-Fehler sind Filterkontextfehler, deshalb fixiert die Testsuite die Kennzahlen an mehreren Kontexten und nicht nur an der Gesamtsumme.
Definitionen vor DAX — auch die strittigen
Jede Kennzahl wurde schriftlich definiert, bevor eine Zeile DAX entstand. Wird eine Zahl nur durch den Code definiert, der sie berechnet, wird der Code zur Definition, und niemand kann mehr sagen, ob sie richtig ist — nur noch, ob sie durchläuft.
Der Kennzahlenvertrag hält auch fest, wo mehr als eine vertretbare Definition existiert. Die Einzelbieterquote ist der klare Fall: Bei 55 von 351 Zuschlägen ist die Zahl der Bieter nicht erfasst. Zählt man nur Zuschläge mit bekannter Bieterzahl, ergibt das 19,9 %; zählt man alle, 16,8 %. Ein Abstand von 3,1 Punkten ist keine Rundung und verändert die Lesart des Befundes. Die erste Variante ist zertifiziert, die zweite steht daneben, und keine erscheint je ohne die Abdeckung der Bieterdaten von 84,3 %, die beide begrenzt.
Die gescheiterte Verknüpfung, als Befund veröffentlicht
Der ursprüngliche Entwurf verglich das Vergabevolumen mit den Ressorthaushalten. Nur 1 von 104 Auftraggebern ließ sich einem Bundesressort zuordnen. Die Ursache ist struktureller Natur und nicht durch Nachjustieren behebbar: Die deutschen Auftraggeber in TED sind überwiegend Kommunen, Länder, Krankenhäuser und Versorger, während der Bundeshaushalt nur Bundesministerien abdeckt. Beide Mengen überschneiden sich kaum, also kann auch besseres Matching sie nicht verbinden.
Der Vergleich wurde aus dem Bericht entfernt. An seiner Stelle steht die gescheiterte Verknüpfung als Befund — zwei amtliche Datenbestände über verwandte staatliche Tätigkeit, die sich in diesem Zuschnitt nicht verbinden lassen. Sauber gelöst bräuchte es Landes- und Kommunalhaushaltsdaten, und das ist eine spätere Phase.
