Morgen.
Ich habe eine Tabelle "Auftraege" in meinem DataWarehouse(DW), mit den Spalten [Kunden_ID](int), [Startdatum](date), [Startzeit](smallint), [Enddatum](date), [Endzeit](smallint) und [status](smallint), angelegt.
Ich arbeite mit den SQL-Server Integration Services (SSIS) und die Daten zieht er sich aus dem operativen System(OS).
Mein Problem: So lange ein Auftrag nicht abgeschlossen ist - enthalten die Spalten [Enddatum] und [Endzeit] noch den Wert "NULL", der [status] ist "offen".
Diese Werte stehen auch so in meinem DW. Wenn jetzt der Auftrag abgeschlossen wird, werden im OS die NULL-werte gefüllt und der [status] auf "abgeschlossen" gesetzt.
Wenn ich mein SSIS-Paket erneut starte, sollen alle neuen Aufträge, die noch nicht in "Auftrage" drin übernommen werden. So weit auch kein problem.
ABER: Den geänderten - offenen Auftrag aus den OS - erkennt er auch als neuen Eintrag, weil ja Werte geändert wurden und nicht mehr mit den anderen Zeilen übereinstimmen, und schreibt mir die komplette Zeile als neue Zeile in meine DW-Tabelle. So habe ich für ein und denselben Auftrag eine Zeile ohne [Enddatum], [Endzeit] und mit [status] "offen" und eine Zeile mit [Enddatum],[Endzeit] und [status] "geschlossen"
Wie bekomme ich es über einen SQL-Befehl hin, dass sich die Tabelle "Auftraege" mit sich selbst vergleicht? Also die gleichen [Kunden_ID], [Startdatum] und [Startzeit] sucht und bei veränderten [Enddatum], [Endzeit] und [status] die alten Zeilen löscht?
In Excel ist das ganz einfach - aber über einen sql-Befehl stoß ich an meine Grenzen. Versucht man das Problem zu googlen bekomme ich oft den Self-Join angeboten - aber mit dem komme ich auch nicht so richtig auf nen grünen Zweig.
Ansonsten gibt es natürlich noch immer die Möglichkeiten, dass ich vor jeden Start des SSIS-Pakets die inhalte der Auftrags-Tabelle lösche und komplett alle Werte aus dem OS neu lade, oder mir eine Mapping Tabelle schaffe über die ich die Werte eindeutig vergleichen kann. Aber das ist alles nich so schön, aber immerhin würde es funktionieren.
Danke für's eventuelle Lesen und danke schonmal für eventuelle Hilfen.
Ich habe eine Tabelle "Auftraege" in meinem DataWarehouse(DW), mit den Spalten [Kunden_ID](int), [Startdatum](date), [Startzeit](smallint), [Enddatum](date), [Endzeit](smallint) und [status](smallint), angelegt.
Ich arbeite mit den SQL-Server Integration Services (SSIS) und die Daten zieht er sich aus dem operativen System(OS).
Mein Problem: So lange ein Auftrag nicht abgeschlossen ist - enthalten die Spalten [Enddatum] und [Endzeit] noch den Wert "NULL", der [status] ist "offen".
Diese Werte stehen auch so in meinem DW. Wenn jetzt der Auftrag abgeschlossen wird, werden im OS die NULL-werte gefüllt und der [status] auf "abgeschlossen" gesetzt.
Wenn ich mein SSIS-Paket erneut starte, sollen alle neuen Aufträge, die noch nicht in "Auftrage" drin übernommen werden. So weit auch kein problem.
ABER: Den geänderten - offenen Auftrag aus den OS - erkennt er auch als neuen Eintrag, weil ja Werte geändert wurden und nicht mehr mit den anderen Zeilen übereinstimmen, und schreibt mir die komplette Zeile als neue Zeile in meine DW-Tabelle. So habe ich für ein und denselben Auftrag eine Zeile ohne [Enddatum], [Endzeit] und mit [status] "offen" und eine Zeile mit [Enddatum],[Endzeit] und [status] "geschlossen"
Wie bekomme ich es über einen SQL-Befehl hin, dass sich die Tabelle "Auftraege" mit sich selbst vergleicht? Also die gleichen [Kunden_ID], [Startdatum] und [Startzeit] sucht und bei veränderten [Enddatum], [Endzeit] und [status] die alten Zeilen löscht?
In Excel ist das ganz einfach - aber über einen sql-Befehl stoß ich an meine Grenzen. Versucht man das Problem zu googlen bekomme ich oft den Self-Join angeboten - aber mit dem komme ich auch nicht so richtig auf nen grünen Zweig.
Ansonsten gibt es natürlich noch immer die Möglichkeiten, dass ich vor jeden Start des SSIS-Pakets die inhalte der Auftrags-Tabelle lösche und komplett alle Werte aus dem OS neu lade, oder mir eine Mapping Tabelle schaffe über die ich die Werte eindeutig vergleichen kann. Aber das ist alles nich so schön, aber immerhin würde es funktionieren.
Danke für's eventuelle Lesen und danke schonmal für eventuelle Hilfen.
Comment