Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Datenqualität sichern Wenn sich Controlling und Buchhaltung streiten Praxisseminar zu Datenqualitätsanalysen mit der Service GmbH als Fallbeispiel.

Ähnliche Präsentationen


Präsentation zum Thema: "Datenqualität sichern Wenn sich Controlling und Buchhaltung streiten Praxisseminar zu Datenqualitätsanalysen mit der Service GmbH als Fallbeispiel."—  Präsentation transkript:

1 Datenqualität sichern Wenn sich Controlling und Buchhaltung streiten Praxisseminar zu Datenqualitätsanalysen mit der Service GmbH als Fallbeispiel

2 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

3 So......oder so?

4 So......oder so?

5 Wer glaubt schon bunten Charts?

6 Die Kosten der schlechten Daten

7 Versteckte Kosten durch schlechte Datenqualität Manuelles Nacharbeiten von Daten Beschwerden -> Aufwand in Call Center Erhöhte Projektkosten bei Einführung neuer Systeme Bis 25% gestoppt, bis zu 60% Verzug aufgrund falscher oder fehlender Daten Verspätete Unternehmensberichte Verlorene Kunden durch schlechten Support Produktionsausfälle durch Störung in der Supply Chain

8 Datenqualität? Was ist das? Unsere Daten sind doch sauber! Bis zu 20% der operativen Daten sind betroffen. Unternehmen finanzieren schlechte Daten mit % der IT-Ausgaben. Über schlechte Daten redet man nicht, man arrangiert sich.

9 Ohne Daten kein Business Daten sind der Treibstoff der Prozesse Operative Prozesse Information Chain Kunde Kunden- betreuer Logistik- system Stamm- daten Marketing Buch- haltung Lager Spedition Kunde Bedarf Adresse Kredit- daten Angebot Bestand Bestell- daten KD-Daten Kredit OK Order Adresse Werbung Verkaufs- daten Rechnung Bezahlung Reklamation Mahnung Liefer- schein

10 Ohne Daten kein Business Schlechte Daten sind wie Sand im Getriebe der Geschäftsprozesse Operative Prozesse Information Chain Kunde Kunden- betreuer Logistik- system Stamm- daten Marketing Buch- haltung Lager Spedition Kunde Bedarf Adresse Kredit- daten Angebot Bestand Bestell- daten KD-Daten Kredit OK Order Adresse Werbung Verkaufs- daten Rechnung Bezahlung Reklamation Mahnung Liefer- schein

11 Der Schnittstellen-Aspekt

12 SCMERP CRM Bereitstellung Data Warehouse Data Marts Einheitliche Wandlung der Daten Getrennte Aufbereitung von Daten Pot. Fehler Unter- schiedliche Daten und Fehlerquellen Einheitliche Wandlung der Daten Wo findet das Profiling / die Fehlersuche statt? optimal Akzeptabel Aber nicht optimal Potentiell falsch Nicht glaubhaft Verlässlichkeit

13 SCMERP CRM Bereitstellung Data Warehouse BI Tool A BI Tool B BI Tool C Data Marts Einheitliche Wandlung der Daten Getrennte Aufbereitung von Daten Pot. Fehler Unter- schiedliche Daten und Fehlerquellen Einheitliche Wandlung der Daten Wo findet das Profiling / die Fehlersuche statt? Konsolidierter Datenbereich Konsoli- dierung

14 SCMERP CRM Bereitstellung Data Warehouse BI Tool A BI Tool B BI Tool C Data Marts Unter- schiedliche Daten und Fehlerquellen Datenqualität bezogen auf den Warehousing – Prozess Konsolidierter Datenbereich Konsoli- dierung Heterogene Datenmodelle / Konsistenz / Homonyme / Synonyme Kontinuität des Ladevorgangs / Vollständigkeit Widerspruchsfreiheit zwischen den Quellen

15 SCMERP CRM Bereitstellung Data Warehouse BI Tool A BI Tool B BI Tool C Data Marts Unter- schiedliche Daten und Fehlerquellen Datenqualität bezogen auf den Warehousing – Prozess Konsolidierter Datenbereich Konsoli- dierung Heterogene Datenmodelle / Konsistenz / Homonyme / Synonyme Kontinuität des Ladevorgangs / Vollständigkeit Widerspruchsfreiheit zwischen den Quellen Metadaten Eindeutige Datenobjekte Beschreibungen Homonyme / Synonyme Anwendungsneutral Verlässlichkeit

16 Wo sollten Korrekturen stattfinden Data Warehouse Data Load Correction Operative Anwendung Vorsysteme bzw. Fachabteilungen sind in der Pflicht!

17 Wo sollten Korrekturen stattfinden Data Warehouse Data Load Correction Operative Anwendung ?

18 Internetzugriffe OperativesCRM MIS Controlling Beschwerden AnalytischesCRM DiversifizierungMarketing-Material Produkt Management CallCenter Informationsbasis Oracle Data Warehouse Die Qualität von Data Warehouse daten wird immer wichtiger

19 Das Datenchaos historisch gesehen 1980 Begriffe?

20 Das Datenchaos historisch gesehen 1990

21 Das Datenchaos historisch gesehen und heute?

22 und heute.... Datenmengen verdoppeln sich jährlich Fast jeder Oracle-Kunde hantiert mit mehr als 1 TB Daten Die Zahl der Anwendungen wächst trotz Standard Software und Daten werden tatsächlich strategische Ressource Datenmodellierung?Metadatenmanagement?Datenqualität?

23

24 Fehlende Praxis in Datenmanagement Gewachsene Bedeutung des Faktors Information für den Erfolg von Unternehmen. Ausufernde Datenmengen Vermehrtes Inseltum durch Fertig- Anwendungen Daten- qualität Immer häufigere Prozessänderungen Warum wächst die Herausforderung der Qualität der Daten

25 Was ist Datenqualität? Aspekte (Dimensionen) der Datenqualität Brauchbarkeit der Daten! 1.Korrekt 2.Stimmig 3.Vollständig 4.Dokumentiert 5.Redundanzfrei 6.Aktuell 7.Verfügbar (Access) 8.Nützlich (TCO) 9.Handhabbar 10.Vertrauenswürdig 11.Harmonisch

26 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

27 Die S ERVICE GmbH Fallbeispiel

28 Vermittlung von Dienstleistungen für Endkunden rund um das Handwerk Handwerksleistung Darlehen Großhandel für Baumärkte und Einzelhandel Haushaltswaren Heimwerker Gartenbedarf KFZ-Zubehoer Elektroartikel Bereich Internet-/Versandhandel Computerteile Die S ERVICE GmbH S ERVICE GmbH

29 Die S ERVICE GmbH Unterscheidung Privatkunden Firmenkunden Kundenkarte Privatkunden Entstand aus Zusammenschluss mehrerer Vertriebsgesellschaften Integration der Stammdaten mit Hindernissen

30 S ERVICE GmbH Erwartungen aus dem Unternehmen Vertrieb ControllingManagement MarketingBuchhaltung Vertrieb: wünscht leichtere Auswertungen Was sind wichtige Produkte? Was sind rentable Sparten? Hat sich der Servicebereich gelohnt? Marketing: Absatzzahlen sind nicht aussagefähig Wie viel Kunden gibt es? Lohnt die Kundekarte? Welche Segmentierung gibt es? Buchhaltung: Es fehlen Daten Warum sind die Spediteursrechnungen so hoch? Sind alle Bestellungen korrekt bezahlt worden? Wie hoch sind die Versandkosten pro Lieferung? Was wurde storniert? Controlling: Vergleichbarkeit fehlt Was kosten Produkte im Einkauf? Wie teuer wurden Produkte verkauft? Wie rentabel sind einzelne Produkte? Management: Kennzahlen fehlen Wie hoch sind die liquiden Mittel? Wie hoch sind die Außenstände?

31 Bekannte Probleme: Bestimmte Lieferungen erreichen nie den Adressaten Adressen falsch Die Lieferung wird auch nicht bezahlt Oft Privatkunden Von bestimmten Artikeln werden sehr viele Stückzahlen verkauft In den Statistiken laufen diese Produkte jedoch unter Verlustbringern (Verpackungsmengen stimmen nicht mit denen bei den Lieferanten bezahlten Mengen überein) Was geschieht mit den Retouren? Lieferantenname in Produkte_Stamm passt nicht auf die Lieferantennummer in der Lieferantentabelle Es gibt auch keine passenden Felder

32 Strategische Fragestellungen Welches sind die wirklich profitablen Produkte/Services? Wo wird am meisten Kapital gebunden? Welche Produkte beschaffen am meisten Kapital? Welche Produkte verursachen den höchsten Aufwand? Wie sind die Trends? Auf welche Bereiche soll man sich künftig stärker fokussieren Einzelhandel? Servicevermittlung? Großkundengeschäft? Kann die verkaufte Menge genau festgestellt werden? Welcher Vertriebsmitarbeiter macht welchen Umsatz? Wie hoch ist die Kapitalrückflussquote Ausstände? Kreditlimits? Liquide Mittel für Neuinvestitionen? Das Analysemodell zeigt oft andere (strategische) Fragestellungen auf, die zunächst nicht auf der operativen Ebene offensichtlich sind.

33 Die Controlling-Sicht

34 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-/Verfahrenstechniken Fallbeispiel Service GmbH

35 Induktives und deduktives Vorgehen Wir wissen, vermuten Dinge die nicht stimmen Wir können sinnvolle Analysen aufgrund bekannter Dinge ableiten Wir lassen uns überraschen, was da noch kommt Wir stöbern in den Daten und entdecken Auffälligkeiten beginnen zu kombinieren stellen Hypothesen auf versuchen Zusammenhänge zu beweisen Vermutungen verifizieren Neues entdecken

36 Vorgehensweisen / Methoden im Data Profiling Unternehmensdaten Data Profiling Metadaten Data Quality Assessement Erwartungen an die Datenqualität Abgleich DiscoveryAssertion TestingMetadata Verification Neue Erkenntnisse (Überraschungen) Bottom up

37 Methoden und Hilfsmittel Datenmodellierung Datenqualitätsprüfmethoden Data Profiling Data Profiling Tool Attribut-Klassifizierung (Namen) Kategorisierung von Qualitätsregeln ETL-Tool Datenbank

38 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

39 Zieldefinition Bestandsaufnahme Planen Strukturanalysen Regelanalysen Umsetzung Ergebnisse Erwartungen Geschäftsregeln OwnerUserRessourcenKostenModelle Felder Priorisieren Problemkomplexe ObjekteBeziehungenHierarchien DatenWerteFach Abgleich-AltNeudefinitionMonitoring Top Down Bottom Up Vorgehensmodell Datenqualitätsanalyse 6 Phasen, 95 Aktivitäten, 16 Ergebnis-Templates, 1 Metamodell, Klassifizierungen

40 Vorgehensmodell für Datenqualitätsprojekte Erheben der Grunddaten (Ist-Daten, Wahrnehmungen, Ziele) Beschreibung der Geschäftsprozesse (Ist-Daten, Wahrnehmungen, Ziele) Daten-/Modell-Prüfungen Detailanalyse Geschäftsfelder Data Owner / Daten-Interessenten / Konsumenten DQ-Erwartungen Bekannte Schwachstellen Kosten Prioritäten Objektmodell Datenflüsse und – Schnittstellen Bekannte Geschäftsregeln Vollständigkeitsbetrachtung Betrachtung der Verständlichkeit Schlüsselanalysen / Beziehungsanalysen Analyse von Hierarchien Suche nach Redundanzen (z. B. Normalisierung) Mengenanalyse / Stammdatenabgleiche Überprüfen der Geschäftsregeln Analyse der erkannten Schwachstellen Verifizieren der DQ Erwartungen

41 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

42 Business _Object Attribut Object_ Model Business_ Rule Table Column Physical_ Model_Area Org_Unit owns / is owned_by uses / is used_by contains is_referenced_by contains specify Entity Data Element is_referenced _by controles is_realized_as uses Process contains relates reads writes Program Routine File controles IT_Rule Relevance controles contains has is_realized_as is_checked_with controles Record uses / is used_by controles reads writes contains controles Business Area Logical Area Physical Area Organization Area Einordnung von (Qualitäts-) Regeln im Unternehmen owns

43 Kategorisierung von Qualitätsregeln Kategorie Column RelationshipData RuleValue Rule Komplexität Einfach Komplex Data Rule Type Datumsfolgen ZeitdauerFeldabhängigWorkflowsAbgeleiteter Wert Zeilen- übergreifend Ausschließende Werte Erwartungen Kardinatität= X Häufigkeit=XMax / Min

44 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

45 Datenmodellierung Schlüssel Identifizierung von Dingen Functional Dependencies Versteckte Abhängigkeiten Beziehungen Existenzabhängigkeit Orphans Childless Normalisierung One Fact One Place Ziel: Aufspüren und Minimierung von Redundanzen als eine der Hauptursachen von Datenfehlern

46 Normalisierung 1. Normalform Eine Entity ist in der 1. Normalform, wenn jedes seiner Attribute genau einen Wert in sich aufnimmt. Sammlungen von Werten in Attributen oder unterschiedliche Verwendungen sind nicht erlaubt. Die Werte sollten nicht weiter teilbar, sondern von granularer Natur sein. 2. Normalform Eine Entität befindet sich in der 2. Normalform, wenn alle Attribute von dem kompletten Schlüssel abhängig sind. 3. Normalform Eine Entität befindet sich in der 3. Normalform, wenn alle Attribute von dem Primary Key abhängen und nicht von Nicht-Schlüssel anderen Attributen mitbestimmt werden (funktionale Abhängigkeit).

47 1. Normalform

48 2. Normalform

49 3. Normalform

50

51 Primary KeyNichtschlüssel- Attribut Nicht von einem Schlüssel Abhängige Attribute 3. Normalform

52

53 ArtikelgruppennummerArtikelgruppeArtikelnummer (PK)BeschreibungArtikelname Tabelle PRODUKTE_STAMM Functional Dependency über Primary Key (PK) Zusätzliche verborgene Functional Dependency Funktionale Abhängigkeit

54 ArtikelgruppennummerArtikelgruppeArtikelnummer (PK)BeschreibungArtikelname ArtikelgruppennummerArtikelgruppeBeschreibung Tabelle PRODUKTE_STAMM Tabelle ARTIKEL_GRUPPE Functional Dependency über Primary Key (PK) Zusätzliche verborgene Functional Dependency Redundante Daten mit der Gefahr von fehlerhaften Einträgen Funktionale Abhängigkeit

55 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

56 Kunden_Wohnart_Nr Information zu einem Kunden wird beschrieben Die Art und Weise, wie ein Kunde wohnt wird beschrieben unter- schiedliche Wohnungs- arten sind durch- nummeriert HauptwortEigenschafts- benennung Basistyp BezugsobjektBeschreibende Information Charakter des Attributes Wortstammanalyse hilft bei der Klassifizierung von Column-Namen

57 Basistypgruppe Feldyp und Art des Wertes Rolle in Ab-hängigkeits- be-ziehung Sind NULLs erlaubt Muss Eindeutigkeit vorliegen Identifikatoren und bezeichnende Begriffe meist numerischLHSneinja Beschreibungen, Erzählungen, Texte meist Text, beliebige Zeichen RHSjanein Klassifikatorenalphanumerisch, in Bezug setzende Begriffe, oft wenige Werte RHSeher nicht, eine Klassifizierung sollte für alle Sätze gelten nein Zuständemeist Text, beliebige Zeichen RHSeher nicht, denn Zustände sollten für alle Sätze gelten, nein ZeitenDate / TimeRHSjanein Sequenzen, Aufzählungen Zählwerte) meist numerisch, oft versteckte Schlüsselkandidaten LHS nein ja Mengenmeist numerisch, einfache Zahlenwerte ohne weitere Angaben RHSnein, wenn etwas gezählt wird, sollte es immer gezählt warden ja Operatoren und abgeleitete Größen meist Text, beliebige Zeichen RHSneinja Werte (brauchen i. d. R. eine relativierende Bezugsgröße z. B. Preis -> Währung) meist numerisch, einfache Zahlenwerte ohne weitere Angaben (brauchen i. d. R. eine relativierende Bezugsgröße z. B. Preis -> Währung) RHSneinja Maße, Bezugsgrößen, Einheiten meist Text, beliebige Zeichen RHSneinja

58 select substr(table_name,1,18)Tab, substr(column_name,1,28) Col, substr(data_type,1,8)Typ, substr(data_length,1,3)Len, '| 'Nul, '| 'Basis, '| 'Bus, '| 'Syn_zu, '| 'Hom_zu, '| 'Dom, '| 'Max, '| 'Min From dba_tab_columns where table_name in ('PRODUKTE_STAMM', 'BESTELLUNG', 'LIEFERUNG', 'STORNIERUNG', 'BEST_POSITION', 'Zahlung', 'PRODUKTE_STAMM', 'ARTIKEL_GRUPPE', 'ARTIKELSPARTE', 'KUNDEN_STAMM', 'LIEFERANT', 'LAGER') and owner = 'SG' order by col select substr(table_name,1,18)Tab, substr(column_name,1,28) Col, substr(data_type,1,8)Typ, substr(data_length,1,3)Len, '| 'Nul, '| 'Basis, '| 'Bus, '| 'Syn_zu, '| 'Hom_zu, '| 'Dom, '| 'Max, '| 'Min From dba_tab_columns where table_name in ('PRODUKTE_STAMM', 'BESTELLUNG', 'LIEFERUNG', 'STORNIERUNG', 'BEST_POSITION', 'Zahlung', 'PRODUKTE_STAMM', 'ARTIKEL_GRUPPE', 'ARTIKELSPARTE', 'KUNDEN_STAMM', 'LIEFERANT', 'LAGER') and owner = 'SG' order by col Feldliste Über alle Tabellen hinweg Alphabetisch sortiert nach Spaltennamen Hilft beim Erkennen von Homonymen und Synonymen Hilft bei der Bewertung der Tauglichkeit von Spaltennamen Erlaubt Vorahnungen von Schlüsselkandidaten

59 Feldliste TAB COL TYP LEN NUL BASIS BUS SYN_ZU HOM_ZU DOM MAX MIN KUNDEN_STAMM ANREDE VARCHAR2 10 | | | | | | | | LIEFERANT ANSCHRIFT VARCHAR2 40 | | | | | | | | KUNDEN_STAMM ANZ_KINDER NUMBER 22 | | | | | | | | PRODUKTE_STAMM ANZ_STEUCK_PRO_VERPACKUNG NUMBER 22 | | | | | | | | PRODUKTE_STAMM ARTIKELGRUPPE VARCHAR2 50 | | | | | | | | ARTIKEL_GRUPPE ARTIKELGRUPPENNAME VARCHAR2 50 | | | | | | | | PRODUKTE_STAMM ARTIKELGRUPPENNR NUMBER 22 | | | | | | | | ARTIKEL_GRUPPE ARTIKELGRUPPENNR NUMBER 22 | | | | | | | | PRODUKTE_STAMM ARTIKELNAME VARCHAR2 30 | | | | | | | | PRODUKTE_STAMM ARTIKELNR NUMBER 22 | | | | | | | | BEST_POSITION ARTIKELNUMMER VARCHAR2 400 | | | | | | | | ARTIKELSPARTE ARTIKELSPARTENNAME VARCHAR2 18 | | | | | | | | ARTIKEL_GRUPPE ARTIKELSPARTENNR NUMBER 22 | | | | | | | | ARTIKELSPARTE ARTIKELSPARTENNR NUMBER 22 | | | | | | | | KUNDEN_STAMM BERUFSGRUPPE VARCHAR2 30 | | | | | | | | KUNDEN_STAMM BERUFSGRUPPEN_NR VARCHAR2 1 | | | | | | | | PRODUKTE_STAMM BESCHREIBUNG VARCHAR2 400 | | | | | | | | PRODUKTE_STAMM BESTAND NUMBER 22 | | | | | | | | BESTELLUNG BESTELLDATUM DATE 7 | | | | | | | | STORNIERUNG BESTELLDATUM DATE 7 | | | | | | | | LIEFERUNG BESTELLDATUM DATE 7 | | | | | | | | BEST_POSITION BESTELLDATUM DATE 7 | | | | | | | | BEST_POSITION BESTELLMENGE NUMBER 22 | | | | | | | | BESTELLUNG BESTELLNR NUMBER 22 | | | | | | | | BEST_POSITION BESTELLNR NUMBER 22 | | | | | | | | STORNIERUNG BESTELLNR NUMBER 22 | | | | | | | | LIEFERUNG BESTELLNR NUMBER 22 | | | | | | | | LIEFERUNG BESTELL_TOTAL NUMBER 22 | | | | | | | | BESTELLUNG BESTELL_TOTAL NUMBER 22 | | | | | | | | STORNIERUNG BESTELL_TOTAL NUMBER 22 | | | | | | | | LIEFERANT BEVORZUGUNG_KLASSE NUMBER 22 | | | | | | | | KUNDEN_STAMM BILDUNG VARCHAR2 30 | | | | | | | | KUNDEN_STAMM BILDUNGS_NR VARCHAR2 1 | | | | | | | | KUNDEN_STAMM BRANCHE VARCHAR2 30 | | | | | | | | BEST_POSITION POSNUMMER NUMBER 22 | | | | | | | | TAB COL TYP LEN NUL BASIS BUS SYN_ZU HOM_ZU DOM MAX MIN KUNDEN_STAMM ANREDE VARCHAR2 10 | | | | | | | | LIEFERANT ANSCHRIFT VARCHAR2 40 | | | | | | | | KUNDEN_STAMM ANZ_KINDER NUMBER 22 | | | | | | | | PRODUKTE_STAMM ANZ_STEUCK_PRO_VERPACKUNG NUMBER 22 | | | | | | | | PRODUKTE_STAMM ARTIKELGRUPPE VARCHAR2 50 | | | | | | | | ARTIKEL_GRUPPE ARTIKELGRUPPENNAME VARCHAR2 50 | | | | | | | | PRODUKTE_STAMM ARTIKELGRUPPENNR NUMBER 22 | | | | | | | | ARTIKEL_GRUPPE ARTIKELGRUPPENNR NUMBER 22 | | | | | | | | PRODUKTE_STAMM ARTIKELNAME VARCHAR2 30 | | | | | | | | PRODUKTE_STAMM ARTIKELNR NUMBER 22 | | | | | | | | BEST_POSITION ARTIKELNUMMER VARCHAR2 400 | | | | | | | | ARTIKELSPARTE ARTIKELSPARTENNAME VARCHAR2 18 | | | | | | | | ARTIKEL_GRUPPE ARTIKELSPARTENNR NUMBER 22 | | | | | | | | ARTIKELSPARTE ARTIKELSPARTENNR NUMBER 22 | | | | | | | | KUNDEN_STAMM BERUFSGRUPPE VARCHAR2 30 | | | | | | | | KUNDEN_STAMM BERUFSGRUPPEN_NR VARCHAR2 1 | | | | | | | | PRODUKTE_STAMM BESCHREIBUNG VARCHAR2 400 | | | | | | | | PRODUKTE_STAMM BESTAND NUMBER 22 | | | | | | | | BESTELLUNG BESTELLDATUM DATE 7 | | | | | | | | STORNIERUNG BESTELLDATUM DATE 7 | | | | | | | | LIEFERUNG BESTELLDATUM DATE 7 | | | | | | | | BEST_POSITION BESTELLDATUM DATE 7 | | | | | | | | BEST_POSITION BESTELLMENGE NUMBER 22 | | | | | | | | BESTELLUNG BESTELLNR NUMBER 22 | | | | | | | | BEST_POSITION BESTELLNR NUMBER 22 | | | | | | | | STORNIERUNG BESTELLNR NUMBER 22 | | | | | | | | LIEFERUNG BESTELLNR NUMBER 22 | | | | | | | | LIEFERUNG BESTELL_TOTAL NUMBER 22 | | | | | | | | BESTELLUNG BESTELL_TOTAL NUMBER 22 | | | | | | | | STORNIERUNG BESTELL_TOTAL NUMBER 22 | | | | | | | | LIEFERANT BEVORZUGUNG_KLASSE NUMBER 22 | | | | | | | | KUNDEN_STAMM BILDUNG VARCHAR2 30 | | | | | | | | KUNDEN_STAMM BILDUNGS_NR VARCHAR2 1 | | | | | | | | KUNDEN_STAMM BRANCHE VARCHAR2 30 | | | | | | | | BEST_POSITION POSNUMMER NUMBER 22 | | | | | | | |

60 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Metadaten-Dokumentation – Data Quality Plan Datenmodellierung – Die Grundlage Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

61 Data Profiling Tool Standardanalysen Unique Keys Functional Dependencies Relationships Domains Redundant Columns Patterns, Types Statistiken Six Sigma Rules (Business-/ IT-Rules) Generierung von Korrekturen Auditing Eingebettet in ein ETL-Tool hohe Flexibilität beim Bereitstellen von Daten Direktes Anwenden erkannter Regeln für eine spätere Datenaufbereitung und Minitoring Ablaufumgebung ist die Datenbank Datennähe

62 Data Profiling Tool Methoden Feintuning zu den Analyse- methoden Die operativen Daten Proto- kollierung laufende Analysen Drill Down zu den operativen Daten

63 ETL - Tool SQL-basiert wenig Lernaufwand Ablaufumgebung ist die Datenbank hohe Performance Wiederverwendung von DB-Funktionen und Infrastruktur Metadaten- / Modell-gesteuert

64

65 Profiling mit OWB Lizenz-Situation Arbeiten mit dem Tool Alternativen

66 Warum ist ein Tooleinsatz bei Datenqualitätsanalysen sinnvoll? Das meiste geht auch ohne Tool, allerdings mühsam Functional Dependencies

67 Auswahl und Ergebnisansicht Methoden Chart-Darstellung Tabellen-Darstellung Drill-Werte Operative Datensätze Die Tabellen, die zu dem Analyse- fukus gehören Feintuning zu den Analyse- methoden Analyse- Job- Protokolle Aktivierbare Business Rules Starten eines Profiling-Laufs Starten einer Correction- Mapping-Generierung Generierung- Rule

68 Source Stage Profiling Stage SAP R/3 SAP Integrator non Oracle Gateway / ODBC / FTP Oracle 9i / 10g / 11g DB2, SQL Server Informix, Teradata LDAP Meta Daten Repository Direct Path DBLink Transportable Modules DBMS_LDAP Siebel CRM Oracle eBusiness Text / XML Analyse Datenbank Analyseumgebung

69 Eindeutigkeitsanalysen (Unique Key)

70 Wertebereichsanalysen (Domain)

71 Funktionale Abhängigkeiten

72 Beziehungen (Relational)

73 Wertmustererkennung (Pattern)

74 Formate (Data Type)

75 Statistiken (Aggregation)

76 Korrekt, muß 0 sein Korrekt: Es kann nur ein Wert gepflegt sein. Korrekt, muß 0 sein Korrekt, das sind richtige Werte Korrekt, muß 0 sein Korrekt: Zusammen 100% (Alle Fälle erfasst) Problem: kein Schlüsselfeld ist gepflegt Korrekt, das sind die richtigen Werte Korrekt, muß 0 sein Korrekt Korrekt: Zusammen 100%. (Alle Fälle erfasst) Problem Korrekt, muß 0 sein Individuelle Regeln (Data Rules)

77 Rule-Varianten

78 Native PL/SQL Profiling Routinen Können von jedem genutzt werden Können verändert und weiterentwickelt werden Laufen in der Datenbank Decken die wichtigsten Profiling-Funktionen ab Aggregationen (Max/Min, Nulls, Selektivität, Numerisch, alphanumerisch, prozentual Anteile Domain-Analyse Liste der Domains, Anzahl Domain-Werte, prozentuale Anteile Pattern-Analyse Liste der Pattern, Anzahl Pattern-Werte, prozentuale Anteile Functional Dependency LHS-Key,RHS-Attribute, Anzahl DP-Treffer, prozentuale Anteile, Anzahl Fehlerfälle, Orphan-Anzahl, Orphan-Prozent Data Type Analyse Numerisch, alphanumerisch, date, null, Anzahl Werte, prozentuale Werte Unique-Key-Analyse Anzahl Treffer, Anzahl Sätze, prozentualer Anteil

79 DATA Viewer Native PL/SQL Profiling Routinen DatenschemaSYS Schema DQ_CALL_FDDQ_CALL_AGGR DQ_CALL_TYPEDQ_CALL_PATTERN DQ_CALL_DOMAINDQ_CALL_UNIQUE Kunde DQ_Kunde_FD DQ_Kunde_AGGR DQ_Kunde_TYPE DQ_Kunde_PATTERN DQ_Kunde_DOMAIN DQ_Kunde_UNIQUE SQL Developer

80 Hilfsscripte Alpha_Num_Check.txt Domain_Analyse.txt DQ_Datatype.txt DQ_Datatype_Proc.txt DQ_Domain.txt DQ_Domain_Proc.txt DQ_Feldliste_T300.txt DQ_Statistik.txt FD.txt Feldabhaengigkeit_FD.txt Feldabhaengigkeit_logisch.txt Feldabhaengigkeit_logisch_Wertemengen.txt Feldabhaengigkeit_logisch_Wertereihenfolge.txt Feldstatistik.txt isdate_2.txt isnumber.txt Kardinalitaet.txt Maske.txt Muster_Pattern.txt Orphans_Childless.txt Pattern.txt Redundant.txt Regular_Expression_Syntac.txt strcnt.txt Tabellenuebergreifende_Feldabgaengigkeit.txt Unique_test.txt WITH_Clause_Numeric-Check.txt

81 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Datenmodellierung – Die Grundlage Metadaten-Dokumentation – Data Quality Plan Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

82 Die wichtigsten Analyse-Techniken 1.Fragebögen / Templates 2.Vollständigkeitsanalyse 3.Schnittstellenanalyse 4.Wo und wie liegen Daten vor? 5.Synonymen / Homonymenanalyse 6.Prüfungen von Datenstrukturen Felder, Tabellen, Beziehungen Originaldaten oder Kopien? Müssen alle Daten analysiert werden? Techniken Verfahren

83 Prüfungen von Datenstrukturen Attribut – bezogen Not Null / Pflichtfelder Füllgrade Formatangaben Typen, Längen Pattern Check Constraint Wertbereiche (Domains) Ober-/Untergrenzen / Wertelisten Average Satz – bezogen (Tupel) Abhängigkeiten von Werten in anderen Attributen desselben Satzes Satzübergreifend (Relationen) Primary Key / Eindeutigkeit Aggregat – Bedingungen Ober- Untergrenzen von Summen Anzahl Sätze pro Intervall usw. Rekursive Zusammenhänge Verweise auf andere Sätze derselben Tabelle (Relation) Tabellenübergreifende (Interrelational) Foreign Key Aggregat – Bedingungen Ober- Untergrenzen von Summen Anzahl Sätze pro Intervall usw. Rekursive Zusammenhänge Verweise auf Sätze einer anderen Tabelle (Relation) Zeit – bezogen (Tupel) Zeitinvariante Inhalte Umgang mit Ereignisse Zeitabhängige Veränderungen Über die Zeit mit anderen Daten korrelierende Feldinhalte Verteilungs – bezogen Arithmetische Mittel Varianz / Standardabweichungen Qualitätsmerkmale und Mengen

84 Prüfungen in der Datenbank Viele Prüfungen in der Datenbank An OLTP-Anfordertungen orientiert Oft nicht Massendaten-tauglich Prüfen großer Datenmengen mit mengenbasierter Logik CASE Zwischentabellen WITH Sub-Select

85 Prüfkonzepte in der Datenbank Programmier- aufwendig Kann performance-kritisch sein Erlaubt auch fachliche Prüfungen Stage-Tabelle Varchar2() Kopieren Prüfungen Geprüfte Daten Date Number Varchar2() Statistiken z. B. mit Table Functions

86 Prüfkonzepte in der Datenbank Einfach implementierbar Bessere Performance Nur bei aktivierten Constraints Fachliche Prüfungen kaum möglich Eventuell zusätzliche Prüfungen nötig Stage-Tabelle + Geprüfte Daten Kopieren Statistiken Date Number Varchar2() Bad File Fehlerhafte Sätze Check Constraints Statistik Routine DML Error Log

87 Error Logging Constraints Unique Key / Primary Key Foreign Key Not Null Check Constraint Kunde Kunde_err KUNDENNR VORNAME NACHNAME ORTNR STRASSE TELEFON ORA_ERR_NUMBER$ ORA_ERR_MESG$ ORA_ERR_ROWID$ ORA_ERR_OPTYP$ ORA_ERR_TAG$ Insert into Kunde Values (......)

88 Error Logging: Beispiel 1

89 SQL> desc ERR$_T3; Name Type ORA_ERR_NUMBER$ NUMBER ORA_ERR_MESG$ VARCHAR2(2000) ORA_ERR_ROWID$ ROWID ORA_ERR_OPTYP$ VARCHAR2(2) ORA_ERR_TAG$ VARCHAR2(2000) F1 VARCHAR2(4000) F2 VARCHAR2(4000) SQL> desc ERR$_T3; Name Type ORA_ERR_NUMBER$ NUMBER ORA_ERR_MESG$ VARCHAR2(2000) ORA_ERR_ROWID$ ROWID ORA_ERR_OPTYP$ VARCHAR2(2) ORA_ERR_TAG$ VARCHAR2(2000) F1 VARCHAR2(4000) F2 VARCHAR2(4000) SQL> desc T3 Name Type F1 NUMBER F2 NUMBER SQL> desc T3 Name Type F1 NUMBER F2 NUMBER insert into t3 values(1,2) LOG ERRORS INTO err$_T3 insert into t3 values(1,2) LOG ERRORS INTO err$_T3 exec DBMS_ERRLOG.CREATE_ERROR_LOG ('T3') 1* select substr(ora_err_number$,1,10) Nr,substr(ora_err_mesg$,1,50) Err from ERR$_T3 SQL> / NR ERR ORA-00001: unique constraint (DWH4.IDX_T3) violate 1* select substr(ora_err_number$,1,10) Nr,substr(ora_err_mesg$,1,50) Err from ERR$_T3 SQL> / NR ERR ORA-00001: unique constraint (DWH4.IDX_T3) violate Error Logging: Beispiel 2

90 Einschränkungen + Ausnahmen Direct Path Insert mit Unique-Constraints Update (Merge) mit Unique-Constraints Error Logging verlangsamt den Ladeprozess

91 Arbeiten ohne Constraints Constraints stören bei Massenaktionen im DWH Ausschalten der Constraints Übernahme der Aufgaben von Constraints durch ETL-Prozess Mengen-basierte Vorgehensweise

92 Feldprüfungen: Was kann geprüft werden Formatprüfungen Feldtypen Stringformate, Ausdrücke Not Null Eindeutigkeit Wertebereiche Spaltenübergreifende Table_Checks Inhaltliche Regeln

93 Wichtiges Hilfsmittel: CASE-Anweisung select case 1 when 1 then 1 when 2 then 2 else 0 end ergebnis from dual; select case when isnumeric(999) = 1 then 'Numerisch else 'nicht numerisch end Ergebnis from dual; with tab as ( select '123' col1 from dual union all select 'x23d' col1 from dual ) select case when regexp_like(col1,'^[[:digit:]]') then numerisch' else Nicht numerisch' end from tab with tab as ( select '123' col1 from dual union all select 'x23d' col1 from dual ) select case when regexp_like(col1,'^[[:digit:]]') then numerisch' else Nicht numerisch' end from tab Beispiel 1 Beispiel 2

94 Abarbeitungslogik mit CASE Beispiel mit temporärer Tabelle Temporäre Tabelle ist optional Ist aber damit wesentlich übersichtlicher Erlaubt Kombination von unterschiedlichen Prüfkriterien Stage-Tabelle Varchar2() Kopieren Gepruefte_Daten Date Number Varchar2() Feld1 Feld2 Feld3 Temp-Tabelle Varchar2() Feld1 Feld2 Feld3 Feld1_is_null Feld1_is_numeric Feld2_is_numeric Insert into temp_table Select case.... From Stage_Table Error_Daten Date Number Varchar2() Insert ALL when Feld_1_is_null =1 into Error_Daten when Feld_1_is_null=0 into Gepruefte_Daten

95 Key Feld1 Feld2 Feld3 Feld4... SRC_Table TGT_Table Key Flag Prueftabelle Insert into TGT_TABLE..... Select..,..,..,.. When SRC_TABLE.key = Prueftable.key and Prueftable.key = 0 Insert into Prueftabelle Select Key, case when (Feld1 is NULL) then 1 when (Feld2 != 100) then 2 when (Feld3 < 300) then 3 when (Feld4 = 0) then 4 Else 0 end From SRC_TABLE; Err_Table Insert into TGT_TABLE..... When SRC_TABLE.key = Prueftable.key and Prueftable.key != 0 From SRC_TABLE,Prueftabelle Key Feld1 Feld2 Feld3 Feld4... Key Feld1 Feld2 Feld3 Feld4... Abarbeitungslogik mit CASE Aufbau einer Flag-Tabelle zur besseren Dokumentation

96 Beispiel mit graphischer Modellierung: Einsatz von CASE und Zwischentabelle

97 Beispiel mit manuellem SQL: Einsatz von CASE und Zwischentabelle INSERT INTO EL_KUNDE_TMP (KUNDENNR,VORNAME,NACHNAME, KUNDENNR_IS_NUMERIC) (SELECT NUMMER, NAME, NACHNAME, case when is_number ( NUMMER ) = Y then 1 else 0 end FROM SRC1 ) ; INSERT ALL WHEN KUNDENNR_IS_NUMERIC = 1 THEN INTO EL_KUNDE (KUNDENNR, VORNAME,NACHNAME) VALUES (KUNDENNR, VORNAME, NACHNAME) WHEN KUNDENNR_IS_NUMERIC = 0 THEN INTO EL_KUNDE_FEHLER (KUNDENNR,VORNAME, NACHNAME,KUNDENNR_IS_NUMERIC) VALUES (KUNDENNR, VORNAME, NACHNAME, KUNDENNR_IS_NUMERIC) (SELECT KUNDENNR,VORNAME,NACHNAME,ORTNR,STRASSE,TELEFON,KUNDENNR_IS_NUMERIC FROM EL_KUNDE_TMP ); Zeilen wurden erstellt. Abgelaufen: 00:00: Zeilen wurden erstellt. Abgelaufen: 00:00:02.67

98 Abarbeitungslogik mit CASE / WITH Arbeiten mit WITH-Clause ohne Zwischentabelle create table src ( schluessel varchar2(30), Beschreibung varchar2(30), Rechenfeld varchar2(30)) create table src ( schluessel varchar2(30), Beschreibung varchar2(30), Rechenfeld varchar2(30)) create table tgt ( schluessel number, Beschreibung varchar2(30), Rechenfeld number) create table tgt ( schluessel number, Beschreibung varchar2(30), Rechenfeld number) SCHLUESSEL BESCHREIBUNG RECHENFELD Wert 8*7 2 xxxx yyyy 01 a www 55 Insert into tgt select * from ( with lc as ( select (case when is_number(schluessel) = 'Y' then schluessel else 'BUG' end) schluessel, Beschreibung, (case when is_number(Rechenfeld) = 'Y' then Rechenfeld else 'BUG' end) Rechenfeld from src) select schluessel, Beschreibung, Rechenfeld from lc where schluessel != 'BUG' and Rechenfeld != 'BUG) SCHLUESSEL BESCHREIBUNG RECHENFELD xxxx yyyy 1

99 Prüfungen auf numerisch Hilfsfunktion Is_Number bzw. regexp_like create or replace function is_number(in_var in varchar2) return varchar2 is v_number number; begin select to_number(in_var) into v_number from dual; return 'Y'; -- No exception, so is a number exception when others then return 'N'; -- is not a number end; create or replace function is_number(in_var in varchar2) return varchar2 is v_number number; begin select to_number(in_var) into v_number from dual; return 'Y'; -- No exception, so is a number exception when others then return 'N'; -- is not a number end; select case when regexp_like(col1,'^[[:digit:]]') then numerisch' else Nicht numerisch' end from tab select case when regexp_like(col1,'^[[:digit:]]') then numerisch' else Nicht numerisch' end from tab Alternative mit REGEXP_LIKE

100 Hilfsfunktion: Date_Check In Verbindung mit der Case-Anweisung create or replace function IsDate (str varchar2) return varchar2 is inDate varchar2(40); FUNCTION dateCheck (inputDate varchar2, inputMask varchar2) RETURN varchar2 IS dateVar date; BEGIN dateVar:= to_date(inputDate,inputMask); return 'true'; exception when others then return 'false'; END; BEGIN inDate:= trim(str); if dateCheck(inDate, 'mm-dd-yyyy') = 'false' AND dateCheck(inDate, 'mm-dd-yy') = 'false' AND dateCheck(inDate, 'yyyy-mm-dd') = 'false' AND dateCheck(inDate, 'yy-mm-dd') = 'false' AND dateCheck(inDate, 'yyyy-mon-dd') = 'false AND dateCheck(inDate, 'yy-mon-dd') = 'false AND dateCheck(inDate, 'dd-mon-yyyy') = 'false AND dateCheck(inDate, 'dd-mon-yy') = 'false AND dateCheck(inDate, 'mmddyy') = 'false AND dateCheck(inDate, 'mmddyyyy') = 'false AND dateCheck(inDate, 'yyyymmdd') = 'false' AND dateCheck(inDate, 'yymmdd') = 'false AND dateCheck(inDate, 'yymmdd') = 'false' AND dateCheck(inDate, 'yymondd') = 'false AND dateCheck(inDate, 'yyyymondd') = 'false AND dateCheck(inDate, 'mm/dd/yyyy') = 'false' AND dateCheck(inDate, 'yyyy/mm/dd') = 'false AND dateCheck(inDate, 'mm/dd/yy') = 'false' AND dateCheck(inDate, 'yy/mm/dd') = 'false AND dateCheck(inDate, 'mm.dd.yyyy') = 'false' AND dateCheck(inDate, 'mm.dd.yy') = 'false' AND dateCheck(inDate, 'yyyy.mm.dd') = 'false' AND dateCheck(inDate, 'yy.mm.dd') = 'false' then return 'false'; else return 'true'; end if; --exception --when others then return 'false'; END;

101 Prüfungen auf Feldtypen Variante mit TRANSLATE select schluessel, CASE WHEN LENGTH(TRIM(TRANSLATE(schluessel, ' ',' '))) is null and schluessel is not null THEN 'numerisch' WHEN LENGTH(TRIM(TRANSLATE(schluessel, ' ',' '))) is not null THEN 'alphanumerisch WHEN schluessel is NULL then 'NULL' ELSE 'NULL END Typ from src SCHLUESSEL TYP numerisch 2 numerisch 3 numerisch a alphanumerisch NULL SCHLUESSEL BESCHREIBUNG RECHENFELD Wert 8*7 2 xxxx yyyy 01 a www 55 www 55

102 Satzübergreifende Prüfungen pro Feld Eindeutigkeit

103 Satzübergreifende Prüfungen Eindeutigkeit Finden von Schluessel-Kandidaten Erfüllung der 2. und 3. Normalform Prüfung ergibt nicht für alle Feldtypen einen Sinn i. d. R. LHS-Kandidaten (siehe Feldlisten-Analyse) Herausfinden von potentiellen ETL-Job- Abbruchgründen Beim Schreiben in Tabellen mit Unique-Constraints Beim Aufbau von Parent-Child-Beziehungen in denen eindeutige Parents gebraucht werden

104 Eindeutigkeit select SCHLUESSEL, count(SCHLUESSEL) cnt from unique_test group by SCHLUESSEL SCHLUESSEL CNT select SCHLUESSEL, count(SCHLUESSEL) cnt from unique_test group by SCHLUESSEL SCHLUESSEL CNT SQL> select * from unique_test; SCHLUESSEL FELD abc 2 abc 32 abc 42 abc SQL> select * from unique_test; SCHLUESSEL FELD abc 2 abc 32 abc 42 abc select round(nr_values*100/anz,2) Prozent, nr_values,anz from (select count(*) nr_values from (select SCHLUESSEL, count(SCHLUESSEL) cnt from unique_test group by SCHLUESSEL)), (select count(*) anz from unique_test); PROZENT NR_VALUES ANZ select round(nr_values*100/anz,2) Prozent, nr_values,anz from (select count(*) nr_values from (select SCHLUESSEL, count(SCHLUESSEL) cnt from unique_test group by SCHLUESSEL)), (select count(*) anz from unique_test); PROZENT NR_VALUES ANZ Anzeigen aller Feldwerte mit ihrer jeweiligen Häufigkeit Anzeigen des prozeduralen Grades der Eindeutigkeit select schluessel, n from (select count(schluessel) n, schluessel from unique_test group by SCHLUESSEL ) where n > 1 SCHLUESSEL N select schluessel, n from (select count(schluessel) n, schluessel from unique_test group by SCHLUESSEL ) where n > 1 SCHLUESSEL N Anzeigen der Werte, die die Eindeutigkeit verletzen

105 Prüfung auf Eindeutigkeit: Beispiel graphisch und manuell insert into el_kunde (kundennr,vorname,nachname,ORTNR,strasse,TELEFON) select src2.nummer,src2.name,src2.name,src2.nummer,src2.name,src2.nummer from SRC2, (select nummer from (select count(nummer) n, nummer from src2 group by nummer) where n = 1) doppelte where src2.nummer = doppelte.nummer;

106 Feldstatistik NULL, MAX/MIN, Prozent, Count, Numeric, Alpanumeric… MAX_WERT MIN_WERT ANZ_WERTE SELECTIVITAET IST_NULL IST_NULL_PROZENT IST_NUMERIC IST_NUMERIC_PROZENT IST_ALPHANUMERIC IST_ALPHANUMERIC_PROZENT with lc as ( select SCHLUESSEL, (CASE WHEN SCHLUESSEL is null THEN 1 ELSE 0 END) Ist_Null, (CASE WHEN LENGTH(TRIM(TRANSLATE(SCHLUESSEL, ' ',' '))) is null and SCHLUESSEL is not null THEN 1 ELSE 0 END) Ist_Numeric from unique_test ) Select MAX(SCHLUESSEL )Max_Wert, MIN(SCHLUESSEL )Min_Wert, count(distinct(SCHLUESSEL )) Anz_Werte, round(count(distinct SCHLUESSEL )*100 / count(*),2) Selectivitaet, sum(ist_null) ist_null, sum(ist_null)*100/count(*)ist_null_prozent, sum(Ist_Numeric)ist_numeric, sum(Ist_Numeric)*100/count(*)ist_numeric_prozent, count(*)-(sum(ist_null)+sum(Ist_Numeric))ist_Alphanumeric, (count(*)-(sum(ist_null)+sum(Ist_Numeric)))*100/count(*) ist_Alphanumeric_Prozent from lc; with lc as ( select SCHLUESSEL, (CASE WHEN SCHLUESSEL is null THEN 1 ELSE 0 END) Ist_Null, (CASE WHEN LENGTH(TRIM(TRANSLATE(SCHLUESSEL, ' ',' '))) is null and SCHLUESSEL is not null THEN 1 ELSE 0 END) Ist_Numeric from unique_test ) Select MAX(SCHLUESSEL )Max_Wert, MIN(SCHLUESSEL )Min_Wert, count(distinct(SCHLUESSEL )) Anz_Werte, round(count(distinct SCHLUESSEL )*100 / count(*),2) Selectivitaet, sum(ist_null) ist_null, sum(ist_null)*100/count(*)ist_null_prozent, sum(Ist_Numeric)ist_numeric, sum(Ist_Numeric)*100/count(*)ist_numeric_prozent, count(*)-(sum(ist_null)+sum(Ist_Numeric))ist_Alphanumeric, (count(*)-(sum(ist_null)+sum(Ist_Numeric)))*100/count(*) ist_Alphanumeric_Prozent from lc;

107 Herausfiltern und Protokollieren Not Null Feldern mit graphischen Mitteln case when F2 is NULL then 1 else 0 end

108 Select F1 from (Select count(F1) n,F1 from s group by F1) where n > 1; Prüfen auf Eindeutigkeit der Eingabesätze (Graphik) Es dürfen nur Sätze geladen werden, die einmal im Quell-bestand vorkommen.

109 Mustererkennung (Translate) create table Kunde ( KUNDENNR NUMBER(10), KUNDENNAME VARCHAR2(20), BERUFSGRUPPE VARCHAR2(20), SEGMENT NUMBER(10)); create table Kunde ( KUNDENNR NUMBER(10), KUNDENNAME VARCHAR2(20), BERUFSGRUPPE VARCHAR2(20), SEGMENT NUMBER(10)); column Anzahl format column Maske format a30 select sum(nr_value) Anzahl, maske from (with lc as ( select berufsgruppe,count(NVL(berufsgruppe,'NULL')) nr_value from KUNDE group by berufsgruppe) select berufsgruppe, nr_value,strcnt(TRANSLATE(berufsgruppe, ' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'b AAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaa')) Maske from lc order by NR_Value DESC) group by maske column Anzahl format column Maske format a30 select sum(nr_value) Anzahl, maske from (with lc as ( select berufsgruppe,count(NVL(berufsgruppe,'NULL')) nr_value from KUNDE group by berufsgruppe) select berufsgruppe, nr_value,strcnt(TRANSLATE(berufsgruppe, ' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'b AAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaa')) Maske from lc order by NR_Value DESC) group by maske ANZAHL MASKE Aa{11} 14 Aa{13} 2 Aa{11}b 4 Aa{10} 5 Aa{5} 13 Aa{6} 7 Aa{12} ANZAHL MASKE Aa{11} 14 Aa{13} 2 Aa{11}b 4 Aa{10} 5 Aa{5} 13 Aa{6} 7 Aa{12} SQL> select * from kunde where rownum < 10; KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Schmidt Rentner Meister Angestellte Kraemer Beamte Schneider Freiberufler Schuster Selbstaendige Mueller Unbeschaeftigt Schneider Angestellte Hartmann Rentner 46 SQL> select * from kunde where rownum < 10; KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Schmidt Rentner Meister Angestellte Kraemer Beamte Schneider Freiberufler Schuster Selbstaendige Mueller Unbeschaeftigt Schneider Angestellte Hartmann Rentner 46 9 digit A upper letter a lower letter B blank {n} n-time repetition

110 Mustererkennung (REGEXP_LIKE) create table Kunde ( KUNDENNR NUMBER(10), KUNDENNAME VARCHAR2(20), BERUFSGRUPPE VARCHAR2(20), SEGMENT NUMBER(10)); create table Kunde ( KUNDENNR NUMBER(10), KUNDENNAME VARCHAR2(20), BERUFSGRUPPE VARCHAR2(20), SEGMENT NUMBER(10)); SQL> select * from kunde where rownum < 10; KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Schmidt Rentner Meister Angestellte Kraemer Beamte Schneider Freiberufler Schuster Selbstaendige Mueller Unbeschaeftigt Schneider Angestellte Hartmann Rentner 46 SQL> select * from kunde where rownum < 10; KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Schmidt Rentner Meister Angestellte Kraemer Beamte Schneider Freiberufler Schuster Selbstaendige Mueller Unbeschaeftigt Schneider Angestellte Hartmann Rentner 46 SQL> select * from kunde where REGEXP_LIKE(segment,'^[[:digit:]]{1}$'); KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Mueller Unbeschaeftigt Schuster Student Kraemer Rentner Mueller Unbeschaeftigt Bauer Freiberufler 3 SQL> select * from kunde where REGEXP_LIKE(segment,'^[[:digit:]]{1}$'); KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Mueller Unbeschaeftigt Schuster Student Kraemer Rentner Mueller Unbeschaeftigt Bauer Freiberufler 3 Finde alle Sätze, deren Segment-Wert nur 1-stellig numerisch ist

111 Parameter * Match 0 or more times ? Match 0 or 1 time + Match 1 or more times {m} Match exactly m times {m,} Match at least m times {m, n} Match at least m times but no more than n times \n Cause the previous expression to be repeated n times [:alnum:] Alphanumeric characters [:alpha:] Alphabetic characters [:blank:] Blank Space Characters [:cntrl:] Control characters (nonprinting) [:digit:] Numeric digits [:graph:] Any [:punct:], [:upper:], [:lower:], and [:digit:] chars [:lower:] Lowercase alphabetic characters [:print:] Printable characters [:punct:] Punctuation characters [:space:] Space characters (nonprinting), such as carriage return, newline, vertical tab, and form feed [:upper:] Uppercase alphabetic characters [:xdigit:] Hexidecimal characters

112 select count(pattern) Anzahl, pattern Muster from (select PNR, case when REGEXP_LIKE(pruef_wert,'^[[:digit:]]{1}$') then 'einstellig numerisch' when REGEXP_LIKE(pruef_wert,'^[[:digit:]]{2}$') then 'zweistellig numerisch' when REGEXP_LIKE(pruef_wert,'^[[:upper:]]{1}[[:digit:]]{2}$') then '1 Großbuchstabe + 2 Zahlen' when REGEXP_LIKE(pruef_wert,'^[[:upper:]]{1}-[[:digit:]]{5}$') then 'PLZ' else 'falscher Wert' end pattern from P) group by pattern; select count(pattern) Anzahl, pattern Muster from (select PNR, case when REGEXP_LIKE(pruef_wert,'^[[:digit:]]{1}$') then 'einstellig numerisch' when REGEXP_LIKE(pruef_wert,'^[[:digit:]]{2}$') then 'zweistellig numerisch' when REGEXP_LIKE(pruef_wert,'^[[:upper:]]{1}[[:digit:]]{2}$') then '1 Großbuchstabe + 2 Zahlen' when REGEXP_LIKE(pruef_wert,'^[[:upper:]]{1}-[[:digit:]]{5}$') then 'PLZ' else 'falscher Wert' end pattern from P) group by pattern; Mustererkennung (REGEXP_LIKE) create table P (PNR number, pruef_wert varchar2(20)); create table P (PNR number, pruef_wert varchar2(20)); SQL> select * from p; PNR PRUEF_WERT A89 4 D Eumel 7 A89 6 D D SQL> select * from p; PNR PRUEF_WERT A89 4 D Eumel 7 A89 6 D D ANZAHL MUSTER zweistellig numerisch 2 1 Großbuchstabe + 2 Zahlen 2 falscher Wert 1 einstellig numerisch 2 PLZ ANZAHL MUSTER zweistellig numerisch 2 1 Großbuchstabe + 2 Zahlen 2 falscher Wert 1 einstellig numerisch 2 PLZ

113 Check Constraint mit Regular Expressions CREATE TABLE Check_KUNDE ( KUNDENNR NUMBER, GESCHLECHT NUMBER, VORNAME VARCHAR2(50), NACHNAMEVARCHAR2(50), ANREDE VARCHAR2(10), GEBDAT DATE, ORTNR NUMBER, STRASSE VARCHAR2(50), TELEFON VARCHAR2(30) ); Alter table check_kunde add constraint Ch_KD_Name check(REGEXP_LIKE(NACHNAME, '[^[:digit:]]')); Regel: Im Kundennamen müssen Buchstaben vorkommen und keine reine Zahlenkolonne insert into check_kunde (kundennr,Geschlecht, Vorname, Nachname, Anrede,Gebdat,Ortnr,Strasse,Telefon) Values (9,1,'Klaus','123','Herr',' ',2,'Haupstr.', ); FEHLER in Zeile 1: ORA-02290: CHECK-Constraint (DWH.CH_KD_NAME) verletzt

114 variable Anz_Records number; begin select count(*) into :Anz_Records from Kunde; end; / select * from ( select BERUFSGRUPPEValue_name, count(BERUFSGRUPPE) Anzahl_Werte, case when count(BERUFSGRUPPE) = 0 then 0 else round((count(BERUFSGRUPPE)*100)/:Anz_records,2) end Prozent from KUNDE group by BERUFSGRUPPE order by Anzahl_Werte desc) where rownum < 10; variable Anz_Records number; begin select count(*) into :Anz_Records from Kunde; end; / select * from ( select BERUFSGRUPPEValue_name, count(BERUFSGRUPPE) Anzahl_Werte, case when count(BERUFSGRUPPE) = 0 then 0 else round((count(BERUFSGRUPPE)*100)/:Anz_records,2) end Prozent from KUNDE group by BERUFSGRUPPE order by Anzahl_Werte desc) where rownum < 10; Domain-Analysen create table Kunde ( KUNDENNR NUMBER(10), KUNDENNAME VARCHAR2(20), BERUFSGRUPPE VARCHAR2(20), SEGMENT NUMBER(10)); create table Kunde ( KUNDENNR NUMBER(10), KUNDENNAME VARCHAR2(20), BERUFSGRUPPE VARCHAR2(20), SEGMENT NUMBER(10)); SQL> select * from kunde where rownum < 10; KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Schmidt Rentner Meister Angestellte Kraemer Beamte Schneider Freiberufler Schuster Selbstaendige Mueller Unbeschaeftigt Schneider Angestellte Hartmann Rentner 46 SQL> select * from kunde where rownum < 10; KUNDENNR KUNDENNAME BERUFSGRUPPE SEGMENT Meister Angestellte Schmidt Rentner Meister Angestellte Kraemer Beamte Schneider Freiberufler Schuster Selbstaendige Mueller Unbeschaeftigt Schneider Angestellte Hartmann Rentner 46 VALUE_NAME ANZAHL_WERTE PROZENT Unbeschaeftigt Rentner Selbstaendige Student Beamte Angestellte Freiberufler Freiberufler VALUE_NAME ANZAHL_WERTE PROZENT Unbeschaeftigt Rentner Selbstaendige Student Beamte Angestellte Freiberufler Freiberufler

115 Spaltenübergreifende Prüfungen Wertabhängigkeiten Synchrone Wertzuordnung Ableitung 1:1 Formeln Kardinalität Functional Dependencies

116 Wertabhängigkeiten (asynchron) create table t (F1 varchar2(5), F2 varchar2(5), F3 varchar2(5)); create table t (F1 varchar2(5), F2 varchar2(5), F3 varchar2(5)); SQL> select * from t; F1 F2 F a ab b a am b b bx x c ck k a al b d dt t d ab t gh SQL> select * from t; F1 F2 F a ab b a am b b bx x c ck k a al b d dt t d ab t gh LHS (F1)RHS(F2) abcdabcd ab am bx ck al dt ab gh (1:3) (1:2) select count(distinct f1) LHS_Anzahl, f2 RHS_Wert from t group by f2; LHS_ANZAHL RHS_WERT dt 2 ab 1 bx 1 gh 1 am 1 ck 1 al select count(distinct f1) LHS_Anzahl, f2 RHS_Wert from t group by f2; LHS_ANZAHL RHS_WERT dt 2 ab 1 bx 1 gh 1 am 1 ck 1 al with lc as (select count(distinct f1) LHS_Anzahl,f2 from t group by f2) (select LHS_Anzahl,count(LHS_Anzahl) Vorkommen from LC group by LHS_Anzahl) LHS_ANZAHL VORKOMMEN with lc as (select count(distinct f1) LHS_Anzahl,f2 from t group by f2) (select LHS_Anzahl,count(LHS_Anzahl) Vorkommen from LC group by LHS_Anzahl) LHS_ANZAHL VORKOMMEN Bei 6 RHS-Werten gibt es nur exakt 1 LHS-Wert Bei 1 RHS-Wert gibt es zwei LHS-Werte

117 Wertabhängigkeiten (synchron) create table t (F1 varchar2(5), F2 varchar2(5), F3 varchar2(5)); create table t (F1 varchar2(5), F2 varchar2(5), F3 varchar2(5)); SQL> select * from t; F1 F2 F a ab b a am b b bx x c ck k a al b d dt t d ab t gh SQL> select * from t; F1 F2 F a ab b a am b b bx x c ck k a al b d dt t d ab t gh LHS (F1)RHS(F3) aabcaddaabcadd bbxkbttbbxkbtt (1:1) select count(distinct f1) LHS_Anzahl, f3 RHS_Wert from t group by f3; LHS_ANZAHL RHS_WERT k 1 b 1 t 1 x 1 select count(distinct f1) LHS_Anzahl, f3 RHS_Wert from t group by f3; LHS_ANZAHL RHS_WERT k 1 b 1 t 1 x 1 with lc as (select count(distinct f1) LHS_Anzahl,f3 from t group by f3) (select LHS_Anzahl,count(LHS_Anzahl) Vorkommen from LC group by LHS_Anzahl) LHS_ANZAHL VORKOMMEN with lc as (select count(distinct f1) LHS_Anzahl,f3 from t group by f3) (select LHS_Anzahl,count(LHS_Anzahl) Vorkommen from LC group by LHS_Anzahl) LHS_ANZAHL VORKOMMEN Bei 5 RHS-Werten gibt es nur exakt 1 LHS-Wert

118 Wertabhängigkeiten Inhaltliche Abhängigkeit von zwei Feldern Variante 1: Wertereihenfolgen Variante 2: Wertemengen IdentifierZustands- beschreibung Zeitabhängige Information AKTION STATUS AKTIONSDATUM AUG MAY SEP OCT SEP SEP SEP SEP SEP-10 AKTION STATUS AKTIONSDATUM AUG MAY SEP OCT SEP SEP SEP SEP SEP-10 Beispielregel zu Variante 1: Die aufsteigenden Statuswerte 10, 20, 30 pro Aktion müssen in zeitlicher Reihenfolge stattfinden. Beispielregel zu Variante 2: Für jede Aktion müssen immer 3 Statusmeldungen und die dazu passenden Aktionsdatumsangaben folgen.

119 Wertabhängigkeiten Inhaltliche Abhängigkeit von zwei Feldern Lösung zu Beispielregel 1: Bei korrekten Angaben zu den Aktionen muss eine Sortierung nach Aktion, Status, Aktionsdatum genauso aussehen wie eine Sortierung nach Aktion, Aktionsdatum, Status. Es werden zwei entsprechende Datenmengen mit einer zusätzlichen laufenden Nummer erzeugt. Bei einem Join der beiden Datenmengen und einem Join-Kriterium bestehend aus der Nummer und den Feldern müssten sich alle Sätze paaren lassen, bzw. zu Fehlern führen, wenn die Werte auf ungleich abgefragt werden. (Lösung in Script, hier nur graphisch) Join-Bedingung

120 Wertabhängigkeiten Inhaltliche Abhängigkeit von zwei Felder, Prüfung auf Wertmengen with lc as (select aktion, count(status) Anz_Status, count(aktionsdatum) Anz_Datum from Statusmeldung group by aktion order by aktion) select aktion, Anz_Status,Anz_Datum from lc where Anz_Status < 3 or Anz_Datum < 3; AKTION ANZ_STATUS ANZ_DATUM with lc as (select aktion, count(status) Anz_Status, count(aktionsdatum) Anz_Datum from Statusmeldung group by aktion order by aktion) select aktion, Anz_Status,Anz_Datum from lc where Anz_Status < 3 or Anz_Datum < 3; AKTION ANZ_STATUS ANZ_DATUM AKTION STATUS AKTIONSDATUM AUG MAY SEP OCT SEP SEP SEP SEP SEP-10 AKTION STATUS AKTIONSDATUM AUG MAY SEP OCT SEP SEP SEP SEP SEP-10 Beispielregel zu Variante 2: Für jede Aktion müssen immer 3 Statusmeldungen und die dazu passenden Aktionsdatumsangaben folgen.

121 Tabellenübergreifende Prüfungen Referenzen Kardinalität Orphans Childless Redundant Columns

122 Tabellenübergreifende Prüfungen – Kardinalität select artikelgruppennr L_Key,' --> ', count(artikelgruppennr) cnt1 from artikel_gruppe group by artikelgruppennr order by artikelgruppennr; L_KEY '-->' CNT > > > > > > > > > > > 1 select artikelgruppennr L_Key,' --> ', count(artikelgruppennr) cnt1 from artikel_gruppe group by artikelgruppennr order by artikelgruppennr; L_KEY '-->' CNT > > > > > > > > > > > 1 select artikelgruppennr R_Key,' --> ', count(artikelgruppennr) cnt2 from produkte_stamm group by artikelgruppennr order by artikelgruppennr; R_KEY '-->' CNT > > > > > > > > > 6 --> 0 select artikelgruppennr R_Key,' --> ', count(artikelgruppennr) cnt2 from produkte_stamm group by artikelgruppennr order by artikelgruppennr; R_KEY '-->' CNT > > > > > > > > > 6 --> 0 select min(l.cnt1), max(l.cnt1), min(R.cnt2), max(R.cnt2) from (select artikelgruppennr L_Key,count(artikelgruppennr) cnt1 from artikel_gruppe group by artikelgruppennr) L, (select artikelgruppennr R_Key,count(artikelgruppennr) cnt2 from produkte_stamm group by artikelgruppennr) R where L.L_Key=R.R_Key; MIN(L.CNT1) MAX(L.CNT1) MIN(R.CNT2) MAX(R.CNT2) select min(l.cnt1), max(l.cnt1), min(R.cnt2), max(R.cnt2) from (select artikelgruppennr L_Key,count(artikelgruppennr) cnt1 from artikel_gruppe group by artikelgruppennr) L, (select artikelgruppennr R_Key,count(artikelgruppennr) cnt2 from produkte_stamm group by artikelgruppennr) R where L.L_Key=R.R_Key; MIN(L.CNT1) MAX(L.CNT1) MIN(R.CNT2) MAX(R.CNT2) :n - Beziehung Prüfung innerhalb einer Tabelle Prüfung über 2 Tabellen hinweg

123 Tabellenübergreifende Prüfungen – Orphans SQL> select distinct artikelgruppennr from produkte_stamm order by artikelgruppennr; ARTIKELGRUPPENNR SQL> select distinct artikelgruppennr from produkte_stamm order by artikelgruppennr; ARTIKELGRUPPENNR SQL> select distinct artikelgruppennr from Artikel_gruppe order by artikelgruppennr; ARTIKELGRUPPENNR SQL> select distinct artikelgruppennr from Artikel_gruppe order by artikelgruppennr; ARTIKELGRUPPENNR Artikel_Gruppe Produkte_Stamm SQL> select count(artikelgruppennr) Anz_Orphans, artikelgruppennr Wert_Orphans from produkte_stamm 2 where artikelgruppennr not in (select artikelgruppennr from Artikel_gruppe) 3 group by artikelgruppennr ; ANZ_ORPHANS WERT_ORPHANS SQL> select count(artikelgruppennr) Anz_Orphans, artikelgruppennr Wert_Orphans from produkte_stamm 2 where artikelgruppennr not in (select artikelgruppennr from Artikel_gruppe) 3 group by artikelgruppennr ; ANZ_ORPHANS WERT_ORPHANS

124 Tabellenübergreifende Prüfungen – Childless SQL> select distinct artikelgruppennr from produkte_stamm order by artikelgruppennr; ARTIKELGRUPPENNR SQL> select distinct artikelgruppennr from produkte_stamm order by artikelgruppennr; ARTIKELGRUPPENNR SQL> select distinct artikelgruppennr from Artikel_gruppe order by artikelgruppennr; ARTIKELGRUPPENNR SQL> select distinct artikelgruppennr from Artikel_gruppe order by artikelgruppennr; ARTIKELGRUPPENNR Artikel_Gruppe Produkte_Stamm select distinct artikelgruppennr from Artikel_gruppe MINUS select distinct g.artikelgruppennr from Artikel_gruppe g, produkte_stamm p where g.artikelgruppennr = p.artikelgruppennr; ARTIKELGRUPPENNR select distinct artikelgruppennr from Artikel_gruppe MINUS select distinct g.artikelgruppennr from Artikel_gruppe g, produkte_stamm p where g.artikelgruppennr = p.artikelgruppennr; ARTIKELGRUPPENNR

125 Redundant Columns Redundanzen: eine der Hauptfehlerursachen Redundanzen innerhalb einer Tabelle Feststellbar mit Select Count(*) from Tabelle where Feld_X = Feld_Y; Redundanzen in unterschiedlichen Tabellen Parent/Child-Beziehungen Child-redundante Information ist meist aus Parent ableitbar Feststellbar mit select Count(*) from Select Count(*) from T1,T2 where T1.PK = T2.PK MINUS Select Count(*) from T1,T2 where T1.PK = T2.PK and T1.Feld_Y = T2.Feld;

126 Redundant Columns Parent- Child create table parent (Parent_Key number, Wert_X varchar2(10)); insert into parent values(1,'AUDI'); insert into parent values(2,'VW'); insert into parent values(3,'OPEL'); insert into parent values(4,'BMW'); insert into parent values(5,'Daimler'); create table parent (Parent_Key number, Wert_X varchar2(10)); insert into parent values(1,'AUDI'); insert into parent values(2,'VW'); insert into parent values(3,'OPEL'); insert into parent values(4,'BMW'); insert into parent values(5,'Daimler'); create table child (Child_key number, Parent_Key number, Wert_Y varchar2(10)); insert into child values(1,1,'AUDI'); insert into child values(2,1,'AUDI'); insert into child values(1,2,'VW'); insert into child values(2,2,'VW'); insert into child values(1,3,'OPEL'); insert into child values(2,3,'OPEL'); insert into child values(1,'4','BMW'); insert into child values(2,'4','BMW'); insert into child values(3,'4','BMW'); insert into child values(4,'4','BMW'); insert into child values(1,5,'Daimler'); insert into child values(2,5,'Daler'); create table child (Child_key number, Parent_Key number, Wert_Y varchar2(10)); insert into child values(1,1,'AUDI'); insert into child values(2,1,'AUDI'); insert into child values(1,2,'VW'); insert into child values(2,2,'VW'); insert into child values(1,3,'OPEL'); insert into child values(2,3,'OPEL'); insert into child values(1,'4','BMW'); insert into child values(2,'4','BMW'); insert into child values(3,'4','BMW'); insert into child values(4,'4','BMW'); insert into child values(1,5,'Daimler'); insert into child values(2,5,'Daler'); SQL> select Count(*) from 2 ((Select Count(*) from parent,child 3 where parent.Parent_Key = child.Parent_Key) MINUS 4 (Select Count(*) from parent,child 5 where parent.Parent_Key = child.Parent_Key and 6 parent.Wert_X = child.Wert_Y)) ; COUNT(*) SQL> select Count(*) from 2 ((Select Count(*) from parent,child 3 where parent.Parent_Key = child.Parent_Key) MINUS 4 (Select Count(*) from parent,child 5 where parent.Parent_Key = child.Parent_Key and 6 parent.Wert_X = child.Wert_Y)) ; COUNT(*)

127 Tabellenübergreifende Prüfungen – Werte Bestellung Best_position Bestellnr (PK) Bestell_Total Bestellnr (FK) Gesamt_Pos_Preis = select count(*) from (select bestellnr,BESTELL_TOTAL from bestellung) B, (select BESTELLNR, sum(GESAMT_POS_PREIS) ges_Pos_Wert from best_position group by BESTELLNR) P where B.bestellnr = P.BESTELLNR and B.BESTELL_TOTAL != P.ges_Pos_Wert ; select count(*) from (select bestellnr,BESTELL_TOTAL from bestellung) B, (select BESTELLNR, sum(GESAMT_POS_PREIS) ges_Pos_Wert from best_position group by BESTELLNR) P where B.bestellnr = P.BESTELLNR and B.BESTELL_TOTAL != P.ges_Pos_Wert ;

128 Stage Schema Analyse Schema SAP R/3 SAP Integrator non Oracle Gateway / ODBC / FTP / Golden Gate Oracle 10g / 11g DB2, SQL Server Informix, Teradata Direct Path DBLink Siebel CRM Text / XML Analyse Datenbank Oracle Quell-Umgebung Sampling Zugreifbarkeit auf Daten

129 Arbeiten mit Datenkopien Entlastung der operativen System Sicherstellen von nicht veränderlichen Daten Verhindern von Seiteneffekten Z. B. von Spacheinstellungen etc. Erleichtert länger dauerndes iteratives Arbeiten Überwinden von technischen Barrieren Z. B. bei SAP-Daten Veränderbarkeit von Daten zu Simulationszwecken Bessere Performance

130 Sampling von Daten SAMPLE – Schlüsselwort select Kundenname from kunde sample (2); In Klammern Prozentwert select /*+ dynamic_sampling(Kunde 4) */Kundenname from kunde Macht nicht immer Sinn Z. B. nicht bei Eindeutigkeitsprüfungen Aber bei Stichproben auf der Suche nach NULL-Werten Immer nur bedingt, vollständige Sicherheit bringt nur eine Komplettsuche

131 Wo macht Sampling Sinn? Verfahren Patternanalyse Domainanalyse Not Null Messung Typfeststellung Max/Min/Aussreisser Eindeutigkeitsanalyse Functional Dependency Orphan / Childless Redundant Column Kardinalität Macht Sinn? Bedingt Nein

132 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Datenmodellierung – Die Grundlage Metadaten-Dokumentation – Data Quality Plan Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

133 Fragebögen und Templates Geben Struktur vor Dokumentieren Verhindern, dass man etwas vergisst Arbeitsgrundlage im Projekt Werden ständig aktualisiert und in allen Phasen verwendet

134 Sinnvolle Listen und Templates für die Projektarbeit T1.10 Liste Geschäftsfelder (zur Fokussierung) T1.15 Datenbestandsliste (für die Vollständigkeitsanalyse) T1.20 Liste Metadatenbestände T1.35 Liste bekannten Schwachstellen und Erwartungen T1.45 Bekannte Business Rules T1.50 Geschätzte Kosten der bekannten Schwachstellen T2.25 Liste Datenbestände, Geschäftsobjekte und Fehldaten T2.50 Regelliste (Bekannte + abgeleitete Regeln) T3.00 Feldliste T3.25 Liste Missverständliche Objektnamen T3.50 Schlüsselliste T3.55 Funktionale Abhängigkeiten T3.60 Beziehungen T3.70 Normalform-Analysen T3.75 Redundante Felder Die wichtigsten Listen

135 Vollständigkeitsanalyse Erstellen von Analysemodell ergibt aus der Befragung der Prozess-Kenner Objektmodell ergibt sich aus dem Analysemodell Rückschlüsse auf fehlende Informationen Über Vergleiche des Objektmodells mit der Datenbestandsliste Analysemodell Objektmodell

136 Schnittstellenanalyse Erstellen von Prozessmodell (Analyse-Modell) Objektmodell Datenbestandsliste Finden von Übergabepunkten als die kritischen Stellen Prozessmodell

137 Synonymen / Homonymenanalyse Homonyme (leichter Fall) 1.Über Feldliste Kandidaten finden 2.Kandidaten mit Aggregation-, Domain-, Pattern-Analyse auf fachliche Gleichheit überprüfen Synonyme (komplexer Fall) 1.Wortstammanalyse 2.Attributklassifizierung 3.Finden von Kandidaten über Basistypen 4.Kandidaten mit Aggregation-, Domain-, Pattern-Analyse auf fachliche Gleichheit überprüfen

138 Finden von Anomalien 1. NF Domainanalyse und Sichtprüfung 2. NF 1.Suche nach Schlüsselkandidaten 1.Feldliste 2.Unique-Key-Prüfung 3.Fokussierung auf zusammengesetzte Schlüssel 2.Functional Dependency Analyse 3. NF Suche nach Schlüsselkandidaten 1.Feldliste 2.Unique-Key-Prüfung 3.Fokussierung auf nicht als Schlüssel genutzte Felder

139 Finden redundanter Spalten Über Feldliste Kandidaten identifizieren, um den späteren Aufwand zu minimieren Felder finden, die nicht geprüft werden müssen Pools von ähnlichen Feldern bilden Stichproben mit Sampling bzw. Domain-Analysen Innerhalb einer Tabelle Feststellen des Schlüsselfeldes Feldinhaltsvergleiche (alle Spalten müssen mit allen anderen Spalten verglichen werden) Eventuell prozentuale Gleichheit feststellen Bei hohem Übereinstimmungsgrad, die Nicht-Treffer mit Domain- bzw. Patternanalyse genauer betrachten. Tabellenübergreifend Finden des Referenzkriteriums (PK / FK) Überprüfen auf Vollständigkeit der Referenz Feldinhaltsvergleiche mit Hilfe eines Joins (wie oben beschrieben)

140 Agenda Teurer Datensumpf" oder "Schlechte Daten kosten einfach nur viel Geld" Einweisung in das Planspiel Service GmbHWenn Controlling auf die Buchhaltung schimpft Eine simulierte Firma mit (einigen) Problemen. Hilfsmittel für die systematische Vorgehensweisen bei Datenqualitätsanalysen Vorgehensmodell – Der rote Faden Datenmodellierung – Die Grundlage Metadaten-Dokumentation – Data Quality Plan Feldliste – Das klassische Hilfe Sonst.: Profiling Tool / ETL Tool / Datenbank Die wichtigsten Analyse-Techniken Die wichtigsten Analyse-Verfahren Fallbeispiel Service GmbH

141

142 Zusammenfassen zu Problemkomplexen Problemkomplex 1: Dies sind Schwierigkeiten bei Auswertungen. Diese sind zwar machbar, aber es fehlen offenbar einzelne Produkte und Produktgruppen. Die Daten müssen umständlich zusammengesucht werden. Ob das Ergebnis stimmt ist unklar. Produktgruppen und einzelne Produkte sind nicht richtig messbar. Von den Produktsparten sind offensichtlich keine Auswertungen möglich. Zu untersuchen sind die Produkte-Stamdatenhierarchien. Problemkomplex 2: Die Zusammenhänge zwischen unterschiedlichen Größen (Einkaufsdaten und Verkaufsdaten) sind nicht stimmig. Welche Waren werden zu welchem Preis beschafft und zu welchem Preis und mit welchem Rabatt verkauft. Problemkomplex 3: Verschiedene Kundengruppen können nicht voneinander abgegrenzt werden. Auch das Thema Kundenkarte gehört dazu. Problemkomplex 4: Spediteursrechnungen und Lieferungen. Wo gehen die Waren hin und wie werden sie bezahlt? Gelingt die Kontrolle über Lieferungen und Zahlungen?

143 Stammdaten (Produkte / Artikel) Stammdaten Hierarchien? Einkaufspreise (fehlerhaft?) Stammdaten (Kunden / Identifizierung ) Lieferungen (Bestellungen /Stornierungen) Wo bleibt die gelieferte Ware? Wie korrekt wird gezahlt? Artikel-, Gruppen-, Spartenberichte Vergleichbarkeit von Einkaufs- und Verkaufspreisen Rabatte? Wer hat wieviel gekauft? Kunden-Segmentierung Welche Produkte lohnen sich Spediteure? Nachvollziehbarkeit von Zahlungen für die Buchhaltung Korrekte Zahlen zur Steuerung von Marketingkampagnen und für den Vertrieb Messbarkeit für Controlling Auswertbarkeit Stimmen die Einträge Problem- komplex Fragestellungen Benannte Probleme Ergebnis

144 Analysemodell: Was wissen wir über den Prozess? Service GmbH Produkte Kunden verkauft Lieferanten Dienst- leistungen PrivatFirmen Kunden- karte Lager HandwerkerSpediteur bestellt beauftragt liefert aus holt ab bietet an beauftragtbietet an beliefert storniert holt stornierte Ware ab liefert ab

145 Geschäftsprozess: Bestellungen Kundendaten prüfen Kreditlimit prüfen Verfüg- barkeit prüfen Dienstleist- ung be- auftragen MAX/MIN Menge Spediteur beauftragen Liefersatz anlegen Bestellsatz updaten Kunden- stamm Produkte- stamm Liefer- schein Vertrag Kunden- stamm Status Bestellung anlegen offene Posten Bestellung Best_Pos Bestellung Best_Pos Lieferung Beschaffung Bestellprozess

146 Objektmodell: Welche Geschäftsobjekte sind an dem Prozess beteiligt? KundeLieferantenZahlungStornierungProdukte Privat- Kunde Firmen- Kunde Kunden- Karte ArtikelServiceLagerBestellungLieferungRetouren Dienst- leister Partner Spediteur Beauf- tragung / Order Bewegungs daten Stamm- daten

147 Vollständigkeitsanalyse Wichtige Daten fehlen! KundeLieferantenZahlungStornierungProdukte Privat- Kunde Firmen- Kunde Kunden- Karte ArtikelServiceLagerBestellungLieferungRetouren Dienst- leister Partner Spediteur Beauf- tragung / Order Bewegungs daten Stamm- daten Liefernummer fehlt. Identifizierung nur über Bestellnummer Keine Untergliederung nach Positionen möglich.

148 Zusammenfassung: Vollständigkeitsanalyse Fehlen wichtiger Daten für Buchhaltung und Controlling Stornierungen können nicht korrekt erfasst werden, damit ist der Rückfluss von Waren nicht messbar -> sie verschwinden im Lager -> Tabelle Stornierungen neu strukturieren Wg. Fehlender Liefernummer können Teillieferungen nicht genau gemessen werden -> Liefernummer einführen Unterscheidung zwischen Dienstleister und Waren-Lieferant wäre sinnvoll. Damit wären Einkaufbedingungen leichter messbar -> Feld Lieferantentyp einführen Es fehlt die Möglichkeit die eingekauften Services bzw. Lieferungen genau zu messen -> Tabelle Beauftragung / Order einführen u. a. m.

149 Verständlichkeit des Datenmodells

150 Homonym Synonym Missver- ständliche Begriffe Synonyme oder nicht? Synonym

151 Betrachtung von Form und Inhalt einzelner Felder Nummern, bzw. Key-Felder sind alphanumerisch anstatt numerisch wie es der Feldname vermuten lässt: KUNDEN_STAMM ->Firmenrabatt der Grund sind wahrscheinlich einzelnen %-Zeichen -> mit dem Feld kann man nicht mehr rechnen, bzw. muss es zunächst aufbereiten PRODUKTE_STAMM -> Stueckpreis (varchar2) KUNDEN_STAMM -> Bildungsnr (varchar2) Felder enthalten z. T. nicht lesbare Zeichen BEST_POSITION -> Ausfuerhrung Viele Felder sind nicht gefüllt KUNDEN_STAMM -> Firmenrabatt / Kontaktperson / Kundenart

152 Wertähnlichkeitsprüfungen Begriffe, die dasselbe meinen, sollten standardisiert werden Standardisierungs-Glossar einführen Lookup-Tabelle mit Mapping- Begriffen einführen

153 Standardisierte Werte Durchgängige Nomenklatur Patternanalyse Das Bemühen sprechende Werte zu nutzen, ist erkennbar, aber bei der Umsetzung war man nicht konsequent Falsche Werte grundsätzlich ablehnen Standardisierungsregeln festlegen

154 Wechselseitige Fehler in den Daten Ein bestimmer Fehler taucht in einem anderen Attribut in abgewandelter Form wieder auf Wahrscheinlich maschinelle Ursache 1.Domainanalyse 2.Direkter Vergleich mit SQL SQL> select BERUFSGRUPPEN_NR,BERUFSGRUPPE from kunden_stamm group by BERUFSGRUPPEN_NR,BERUFSGRUPPE order by BERUFSGRUPPEN_NR; B BERUFSGRUPPE Arbeiter 2 Angest_Oeff_ 3 Schueler 4 Studenten 5 Arbeitslose 6 Renter 7 Selbststaendige 8 NA A ngestellter B eamter 1 3 SQL> select BERUFSGRUPPEN_NR,BERUFSGRUPPE from kunden_stamm group by BERUFSGRUPPEN_NR,BERUFSGRUPPE order by BERUFSGRUPPEN_NR; B BERUFSGRUPPE Arbeiter 2 Angest_Oeff_ 3 Schueler 4 Studenten 5 Arbeitslose 6 Renter 7 Selbststaendige 8 NA A ngestellter B eamter 1 3 KUNDEN_STAMM

155 Inhaltlich falsche Werte Domainanalyse Augenscheinlich falsche Werte Gleichmäßige Werteverteilung bei Feld für Anzahl Kinder Irritierender Umgang mit NULL bzw. fehelenden Werten KUNDEN_STAMM

156 Unique Key Analyse PRODUKTE_STAMM : Artikelnr / Produktnummer Beide Felder werden für unterschiedliche Arten verwendet ein einheitlicher Schlüssel muesste entwickelt werden KUNDEN_STAMM: Kunden_ID / Kundennr Es wird nur Kunden_ID verwendet -> Kundennr muesste gelöscht werden

157 Funktionale Abhängigkeiten Funktionale Abhängigkeiten sollten nach Möglichkeit in einer 3 NF aufgelöst sein Hier gibt es diese Struktur aber schon und dennoch ist das Feld Artikelgruppe in der Tabelle PRDUKTE_STAMM aufgenommen -> dieses Feld muesste entfernt werden Allerdings offenbar es auch gleichzeitig einen Fehler. Artikelgruppe ist offenbar nicht ganz funktional abhängig -> hier muss eine weitere Analyse folgen Ähnliches gilt für die Tabelle BEST_POSITION

158 Kunden_ stamm LieferantZahlungStornierungLager Artikel_ Sparte Artikelspartennnr [1, (90%)] Artikelgruppennr [6, (92%)] Beziehungsanalyse Produktnummer [0, (100%)] Artikelnr [0, (100%)] Order_ID [0, (100%)] Order_ID Bestrellnr [0, (100%)] Order_ID Best_ Position Bestrellnr [213, (90%)] KD_Nummer [1211, (46%)] Kundennr KD_Nummer [0, (100%)] Kunden_ID Bestrellnr [0, (100%)] Bestrellnr Kundencode [0, (100%)] Kunden_ID Kundencode [0, (100%)] Kunden_ID Bestellung Artikel_ Gruppe Bestellnr [6, (97%)] Order_ID Bestellnr [6, (97%)] Bestrellnr Lieferung Kundencode [0, (100%)] Kunden_ID Produkte_ stamm FK-Column [Orphans, (%-korrekte Sätze) ] UK-Column Legende

159 Kreisbeziehungen Die Information Kundennummer kommt in mehreren Tabellen vor Gefahr falscher Dateneintragungen Zudem mutiert der Feldname (Synonyme) Kunden_ID Kundencode KD_Nummer Meist Ergebnis bei dem Zusammenführen von Anwendungen, die unterschiedliche Spalten- namen verwendet haben.

160 Beziehungsanalysen graphisch

161 Orphans und Childless Die Artikelstruktur ist fehlerhaft Es gibt Artikelgruppen, die nicht unter einer Sparte hängen Es gibt Produkte, die nicht Artikel_Gruppen zugeordnet sind --- Orphans select count(artikelgruppennr) Anz_Orphans, artikelgruppennr Wert_Orphans from produkte_stamm where artikelgruppennr not in (select artikelgruppennr from Artikel_gruppe) group by artikelgruppennr ; ANZ_ORPHANS WERT_ORPHANS Childless select distinct artikelgruppennr from Artikel_gruppe MINUS select distinct g.artikelgruppennr from Artikel_gruppe g, produkte_stamm p where g.artikelgruppennr = p.artikelgruppennr; ARTIKELGRUPPENNR Orphans select count(artikelgruppennr) Anz_Orphans, artikelgruppennr Wert_Orphans from produkte_stamm where artikelgruppennr not in (select artikelgruppennr from Artikel_gruppe) group by artikelgruppennr ; ANZ_ORPHANS WERT_ORPHANS Childless select distinct artikelgruppennr from Artikel_gruppe MINUS select distinct g.artikelgruppennr from Artikel_gruppe g, produkte_stamm p where g.artikelgruppennr = p.artikelgruppennr; ARTIKELGRUPPENNR

162 Analyse von Hierarchien Gerade BI-Werkzeuge haben Drill- Pfade, die auf einem sehr groben Aggragations-Level einsteigen. Bei diesem Fehler wird man Produkte mit einer Produktgruppe 100 nicht finden. Im Fall der Service GmbH sind das ausgerechnet alle Service- Leistungen. Sie sind nachträglich in das Angebot hinzu gekommen und man hat die Pflege der Stammdaten vernachlässigt Produkte_Stamm Artikel_Gruppe Artikelsparte ARTIKELSPARTENNR 1, 2,3 ARTIKELSPARTENNR 1,4,3 ARTIKELGRUPPENNR 1,2,3,4,5,6,11,10,9,8,7 ARTIKELGRUPPENNR 100,1,6,2,5,4,7,3,10

163 Umsätze können nicht festgestellt werden ? Abfrage über die Hierarchie Artikelgruppe -> Produkte_Stamm -> Best_Position Abfrage über die Hierarchie Produkte_Stamm -> Best_Position

164 Position ProdukteGruppenSparten Kunden- Stamm Bestellung Falsche Statuskennzeichnung von Finanzprodukten Orphans Fehlerhafte Spartenkennzeichnung von Gruppen Doppelte Wertebelegung von Statuskennzeichnung für Privat- und Firmenkunden. Fehlerhafte Verschlüsselung von Artikel- und Produkten Doppelte Produktnummern Fehlerhafte, nicht rechenbare Einzelpreisbezeichnung Korrekte Werte für: Umsatz pro Sparte? Umsatz pro Gruppe? Umsatz pro Produkt? Werden korrekte Rechnungen gestellt? Umsatz pro Kunde? Macht die Kundenkarte Sinn? Korrekte Business Intelligence Auswertungen?

165 Wer hat Recht Controlling oder Buchhaltung? Zahlen: ControllingZahlen: Buchhaltung

166 Data Quality Management Process Data Profiling Datenkorrektur Data Quality Auditing Data Quality Reporting

167 Datenqualitätsreporting Verarbeitete Sätze pro Berichtzeitraum (Anzahl Positionen pro Bestellungen)

168 Füllstandsanzeige einzelner Werte

169


Herunterladen ppt "Datenqualität sichern Wenn sich Controlling und Buchhaltung streiten Praxisseminar zu Datenqualitätsanalysen mit der Service GmbH als Fallbeispiel."

Ähnliche Präsentationen


Google-Anzeigen