Thomas Wiedmann http://www.twiedmann.de
• Sie befinden sich hier: Startseite > SQL-Backstube > Daten aus Altsystemen normalisieren

Die SQL-Backstube

Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.

31.10.2010: Daten aus Altsystemen normalisieren

Problemstellung

Altdatenübernahme aus Vorgängersystem (Legacy Systemen) gehört zu einer häufigen, aber ziemlich unbeliebten Tätigkeit eines Datenbank- oder Softwareentwicklers. Zumeist wird der Aufwand dafür vollkommen unterschätzt.


Getestet mit folgender Datenbank:

* MySQL 5.1.30
* ..auch andere SQL-Datenbanken sollten keine Probleme damit haben.


Serielle CSV Daten

Ein typisches Problem ist das Normalisieren der seriellen Daten in bestehende Tabellen, denn häufig liefern die Migrationswerkzeuge nur folgenden CSV-Output:


Tabellen erzeugen

Listing 1:

  1. "lfd.Nr","feldname","wert";
  2. "1","kundenr","00001";
  3. "2","name","Musterfrau";
  4. "3","vorname","Meike";
  5. ...
  6. "7","kundenr","00002";
  7. "8","name","Mustermann";
  8. ...

Zum Einlesen (LOAD) solcher CSV-Daten bieten alle Datenbanken entsprechende Werkzeuge. Nun müssen diese Daten aber in bestehende normalisierte Tabellen eingelesen werden. Und dies geht beispielsweise so:


Tabelle und Testdaten

Listing 2:

  1. CREATE TABLE altdaten (
  2. lfdnr integer NOT NULL,
  3. feldname varchar(20),
  4. wert varchar(100),
  5. PRIMARY KEY (lfdnr)
  6. );
  7. INSERT INTO altdaten (lfdnr, feldname, wert) VALUES
  8. ('1','knr', '00001'),
  9. ('2','name', 'Maier'),
  10. ('3','vorname', 'Meike'),
  11. ('4','strasse', 'Maiweg 7'),
  12. ('5','plz', '12000'),
  13. ('6','ort', 'Musterort'),
  14. ('7','knr', '00002'),
  15. ('8','name', 'Schmitt'),
  16. ('9','vorname', 'Stefan'),
  17. ('10','strasse', 'Stadtgasse 14'),
  18. ('11','plz', '14000'),
  19. ('12','ort', 'Musterstadt'),
  20. ('13','knr', '00003'),
  21. ('14','name', 'Schulz'),
  22. ('15','vorname', 'Sonja'),
  23. ('16','strasse', 'Ortsgasse 9'),
  24. ('17','plz', '16000'),
  25. ('18','ort', 'Musterdorf');

Altdaten per SQL normalisieren

Wichtig bei der Analyse der Daten ist die Erkenntnis, dass jede Adresse aus sechs Elementen besteht und eine lückenlose, fortlaufende Nummerierung (Spalte "lfdnr") existiert. Diese Gruppe gilt es nun zu extrahieren und zusammen zu halten.


Listing 3:

  1. /**
  2. * MySQL
  3. */
  4. SELECT (SELECT wert FROM altdaten WHERE lfdnr = gruppe.von_nr ) AS knr,
  5. (SELECT wert FROM altdaten WHERE lfdnr = gruppe.von_nr +1) AS name,
  6. (SELECT wert FROM altdaten WHERE lfdnr = gruppe.von_nr +2) AS vorname,
  7. (SELECT wert FROM altdaten WHERE lfdnr = gruppe.von_nr +3) AS strasse,
  8. (SELECT wert FROM altdaten WHERE lfdnr = gruppe.von_nr +4) AS plz,
  9. (SELECT wert FROM altdaten WHERE lfdnr = gruppe.von_nr +5) AS ort
  10. FROM (SELECT von.lfdnr AS von_nr, bis.lfdnr AS bis_nr
  11. FROM ( SELECT wert, MIN(lfdnr) AS lfdnr
  12. FROM altdaten
  13. WHERE feldname = 'knr'
  14. GROUP BY wert
  15. ) von
  16. JOIN ( SELECT wert, MIN(lfdnr) AS lfdnr
  17. FROM altdaten
  18. WHERE feldname = 'ort'
  19. GROUP BY wert
  20. ) bis
  21. ON von.lfdnr = bis.lfdnr - 5
  22. ) gruppe
  23. ORDER BY gruppe.von_nr;
  24. +-------+---------+---------+---------------+-------+-------------+
  25. | knr | name | vorname | strasse | plz | ort |
  26. +-------+---------+---------+---------------+-------+-------------+
  27. | 00001 | Maier | Meike | Maiweg 7 | 12000 | Musterort |
  28. | 00002 | Schmitt | Stefan | Stadtgasse 14 | 14000 | Musterstadt |
  29. | 00003 | Schulz | Sonja | Ortsgasse 9 | 16000 | Musterdorf |
  30. +-------+---------+---------+---------------+-------+-------------+
  31. 3 rows in set (0.03 sec)

Wichtig bei der SQL-Abfrage (Liste 4:) ist die Überprüfung auf das 1. Element der Datengruppe - also das Feld "knr" - sowie auf das letzte Element - die Spalte "ort". Damit die Datengruppe komplett ist, muß zwischen der ersten und der letzten "lfdnr" dieser Gruppe ( 1 - 6 ) der absolute Wert "sechs Elemente" herauskommen. Dann ist die Gruppe komplett.


Resumee

Die SQL-Abfrage normalisiert die seriellen Daten in ein typisches Tabellenformat. Die Ausgabe kann nun weiter verarbeitet werden.




Sitemap - Inhaltsverzeichnis

© 2002-2017 by Thomas Wiedmann : kontakt (at) twiedmann (punkt) de (Stand : 11.01.2015).