Hallo erstmal: Ich bin neu hier... und mein erster Post ist natürlich eine dumme Frage *g*
Ich habe folgendes Problem (Hauptsächlich mit Effizienz und Form):
Ich habe eine Tabelle, gefüllt mit unbestimmter Anzahl Datensätzen - wenige dutzend bis ca. 1 mio– die ich aus dem Zeiterfassungs-System ziehe.
Jeder Datensatz ist eine Zeitbuchung eines Mitarbeiters oder des Zeitverwaltungsprogrammes. Es sind unbestimmte Anzahl pro Tag, und nicht eindeutig (Gleichartige Buchung, sogar mit gleichen Werten können vorkommen).
Nun möchte ich alle Einträge in dieser Tabelle durchgehen und pro Person und Tag EINEN Datensatz in ein Data-Warehouse schreiben (nicht normalisiert).
Die Stage hat dieses Format:
Zwischenspeicher:
BID numeric(12, 0)
NR_X varchar(15)
NACHNAME varchar(30)
VORNAME varchar(20)
TAG int
BUCHUNGSKONTO int
BEZEICHNER varchar(30)
WERT numeric(10, 2)
Die Tabelle mit den Zusammengefassten Werten sieht ca. so aus:
Einträge
Datum smalldatetime
ID smallint
Kostenstelle nvarchar(16)
Vertrag nvarchar(16)
Sollstunden numeric(4, 2)
Arbeitszeit numeric(4, 2)
Krankenzeit numeric(4, 2)
Krankprozent numeric(5, 2)
KindKrankenzeit numeric(4, 2)
KindKrankprozent numeric(5, 0)
Mein Problem ist nun, dass ich aufgrund von Werten (z.B. In BUCHUNGSKONTO) die Einträge anders verrechnen, bearbeiten und eintragen muss.
Ich habe an in ets sowas gedacht:
DECLARE @BID numeric (12,0),
@NR_X varchar (15),
@NACHNAME varchar(30),
@VORNAME varchar(20),
@TAG int,
@BISKTO_AI int,
@BEZEICHNER varchar (30),
@WERT numeric (10, 2)
Declare ALLCURSOR Cursor For Select * From Zwischenspeicher
Open ALLCURSOR
Fetch next From ALLCURSOR into @BID, @NR_X, @NACHNAME, @VORNAME, @TAG, @BISKTO_AI, @BEZEICHNER, @WERT
While @@Fetch_Status=0 Begin
IF NOT EXISTS (select * FROM Einträge where ID= @NR_X and Datum= DATEADD(day, '01.01.1990', @TAG)
Begin
INSERT into Einträge (Datum, ID) VALUES (DATEADD(day, '01.01.1990', @TAG), @NR_X)
End
IF EXISTS (select * FROM Einträge where ID= @NR_X and Datum= DATEADD(day, '01.01.1990', @TAG)
Begin
IF – Anweisungen für Einträge
END
Fetch next From ALLCURSOR into @BID, @NR_X, @NACHNAME, @VORNAME, @TAG, @BISKTO_AI, @BEZEICHNER, @WERT
End
Close ALLCURSOR
Deallocate TAGCURSOR
Danach würde ich über die Einträge gehen (Liste der veränderten Datensätze speichern?) Und die Prozente berechnen, und die aufeinander Aufbauenden Berechnungen machen. Ausserdem lösche ich den Zwischenspeicher.
Allerdings glaube ich, dass das nicht besonder effektiv läuft. Hatte eine Idee von verschachtelten Cursorn. (Einer der Tage durchgeht, und einer der in den Tagen die einzelnen Buchungen pro Person durchgeht)
Kann mich jemand grob in eine Richtung stoßen, oder hat einen Tipp?
Läuft auf MS-SQL Server 2008
Baue das Datawarehouse teilweise mit dem BIDS
Ich habe folgendes Problem (Hauptsächlich mit Effizienz und Form):
Ich habe eine Tabelle, gefüllt mit unbestimmter Anzahl Datensätzen - wenige dutzend bis ca. 1 mio– die ich aus dem Zeiterfassungs-System ziehe.
Jeder Datensatz ist eine Zeitbuchung eines Mitarbeiters oder des Zeitverwaltungsprogrammes. Es sind unbestimmte Anzahl pro Tag, und nicht eindeutig (Gleichartige Buchung, sogar mit gleichen Werten können vorkommen).
Nun möchte ich alle Einträge in dieser Tabelle durchgehen und pro Person und Tag EINEN Datensatz in ein Data-Warehouse schreiben (nicht normalisiert).
Die Stage hat dieses Format:
Zwischenspeicher:
BID numeric(12, 0)
NR_X varchar(15)
NACHNAME varchar(30)
VORNAME varchar(20)
TAG int
BUCHUNGSKONTO int
BEZEICHNER varchar(30)
WERT numeric(10, 2)
Die Tabelle mit den Zusammengefassten Werten sieht ca. so aus:
Einträge
Datum smalldatetime
ID smallint
Kostenstelle nvarchar(16)
Vertrag nvarchar(16)
Sollstunden numeric(4, 2)
Arbeitszeit numeric(4, 2)
Krankenzeit numeric(4, 2)
Krankprozent numeric(5, 2)
KindKrankenzeit numeric(4, 2)
KindKrankprozent numeric(5, 0)
Mein Problem ist nun, dass ich aufgrund von Werten (z.B. In BUCHUNGSKONTO) die Einträge anders verrechnen, bearbeiten und eintragen muss.
Ich habe an in ets sowas gedacht:
DECLARE @BID numeric (12,0),
@NR_X varchar (15),
@NACHNAME varchar(30),
@VORNAME varchar(20),
@TAG int,
@BISKTO_AI int,
@BEZEICHNER varchar (30),
@WERT numeric (10, 2)
Declare ALLCURSOR Cursor For Select * From Zwischenspeicher
Open ALLCURSOR
Fetch next From ALLCURSOR into @BID, @NR_X, @NACHNAME, @VORNAME, @TAG, @BISKTO_AI, @BEZEICHNER, @WERT
While @@Fetch_Status=0 Begin
IF NOT EXISTS (select * FROM Einträge where ID= @NR_X and Datum= DATEADD(day, '01.01.1990', @TAG)
Begin
INSERT into Einträge (Datum, ID) VALUES (DATEADD(day, '01.01.1990', @TAG), @NR_X)
End
IF EXISTS (select * FROM Einträge where ID= @NR_X and Datum= DATEADD(day, '01.01.1990', @TAG)
Begin
IF – Anweisungen für Einträge
END
Fetch next From ALLCURSOR into @BID, @NR_X, @NACHNAME, @VORNAME, @TAG, @BISKTO_AI, @BEZEICHNER, @WERT
End
Close ALLCURSOR
Deallocate TAGCURSOR
Danach würde ich über die Einträge gehen (Liste der veränderten Datensätze speichern?) Und die Prozente berechnen, und die aufeinander Aufbauenden Berechnungen machen. Ausserdem lösche ich den Zwischenspeicher.
Allerdings glaube ich, dass das nicht besonder effektiv läuft. Hatte eine Idee von verschachtelten Cursorn. (Einer der Tage durchgeht, und einer der in den Tagen die einzelnen Buchungen pro Person durchgeht)
Kann mich jemand grob in eine Richtung stoßen, oder hat einen Tipp?
Läuft auf MS-SQL Server 2008
Baue das Datawarehouse teilweise mit dem BIDS
Comment