none
Wochenstunden zusammenrechnen RRS feed

  • Frage

  • Ich benötige Hilfe bei dem erstellen einer prozedure, die Stunden über eine Woche zusammenrechnet.

    Dazu habe ich in VB ein Datagridview wo die Daten aus dem SQL angezeigt werden. Wenn nun jemand einen neuen Eintrag über die VB Maske betätigt wird automatisch das aktuelle Datum über SQL generiert und in der Spalte 'Datum' hinterlegt als Type 'Date'.

    Der User öffnet zb. die Maske um eine Tätigkeit einzutragen die er gerade erledigt hat, sobald der erste eintrag im Datagridview gemacht wurde wird eine neue ID erstellt + Datum und in die jeweilige Spalte gepackt. Wenn der User nun Uhrzeit von wann bis wann er das machte einträgt wird automatisch die Spalte Dauer ausgefüllt, zb. von 7:00 Uhr bis 8:00, Dauer = 1:00. Wobei die Von, Bis und Dauer Spalte als Int deklariert wurden und in VB als Zeit Maskiert sind.

    Nunn soll die Spalte Gesamt (int) automatisch ausgefüllt werden mit den Werten die in "Dauer" stehen aber nur wöchentlich.

    D.h. das zb. alle "Dauer" einträge vom Montag, 06.01.2014 - Freitag, 10.01.2014 zusammengerechnet werden und in die Gesamt Spalte eingetragen wird für den bestimmten User, dazu gibt es eine User Spalte. Also müsste Gesamt nach User und Datum sortiert werden

    Ich habe schon im internet nachgeforscht, aber ich komm auf kein Lösung.

    Hoffe das ich mein Problem einigermaßen verständlich beschreiben konnte.

    Vielen Dank

    Patrick


    Mittwoch, 8. Januar 2014 09:02

Antworten

  • Hallo Patrick,
    es wäre sicherlich sinnvoll, wenn Du mal etwas zu Deinem Datenmodell erzählen würdest. ich gehe davon aus, dass Du zwei Tabellen hast. Eine für die Tageswerte und eine für die Summen. Wobei Du die Summen auch direkt berechnen könntest, ohne sie abzuspeichern.

    Declare @MeineDaten as Table(Datum date, Userid int, Dauer int);
    Declare @MeineWochenDaten as Table(KW int, Userid int, Dauer int);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 1, 4);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 1, 5);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 1, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 1, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-08', 1, 3);
     Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 2, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 2, 2);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 2, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 2, 2);
    
    With Wochendaten as
    (
    Select Userid, Dauer, DATEPART(ISO_WEEK, Datum) as KW
    from @MeineDaten
    )
    Insert into @MeineWochenDaten(Userid, KW, Dauer)  
    Select Userid, KW, Sum(Dauer) as Gesamtdauer
    from Wochendaten
    group by Userid, KW
    ;
    
    Select D.Userid, D.Datum, D.Dauer as Tagesstunden, W.KW, W.Dauer as Wochenstunden
    from @MeineDaten D
    left Join @MeineWochenDaten W
    on d.Userid = w.Userid
    and DATEPART(ISO_WEEK, D.Datum) = W.KW
    order by Userid, Datum, KW;
    Je nach gewünschter Logik müsstest Du das noch ausbauen zu einem Update/Merge auf die Wochenstunden, bzw. vorher ein Truncate auf die Wochenstunden absetzen.

    Einen schönen Tag noch,
    Christoph

    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu
    Donnerstag, 9. Januar 2014 12:25
    Beantworter
  • Hallo Patrick, meinst Du etwas in dieser Richtung?

    Declare @MeineDaten as Table(Datum date, Userid int, Dauer int);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 1, 4);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 1, 5);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 1, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 1, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-08', 1, 3);
     Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 2, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 2, 2);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 2, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 2, 2);
     With Wochendaten as
    (
    Select Userid, Dauer, DATEPART(ISO_WEEK, Datum) as KW
    from @MeineDaten
    )
    Select Userid, KW, Sum(Dauer) as Gesamtdauer
    from Wochendaten
    group by Userid, KW
    order by Userid, KW
    ;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 8. Januar 2014 14:48
    Beantworter

Alle Antworten

  • Hallo Patrick, meinst Du etwas in dieser Richtung?

    Declare @MeineDaten as Table(Datum date, Userid int, Dauer int);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 1, 4);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 1, 5);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 1, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 1, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-08', 1, 3);
     Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 2, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 2, 2);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 2, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 2, 2);
     With Wochendaten as
    (
    Select Userid, Dauer, DATEPART(ISO_WEEK, Datum) as KW
    from @MeineDaten
    )
    Select Userid, KW, Sum(Dauer) as Gesamtdauer
    from Wochendaten
    group by Userid, KW
    order by Userid, KW
    ;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 8. Januar 2014 14:48
    Beantworter
  • Danke das sieht schonmal gut aus :)

    Den ersten teil mit den Inserts brauch ich nicht da die Daten schon vorhanden sind. Ich habe den 2ten Teil mal an meine Bedürfnisse angepasst aber leider funktioniert er noch nicht.

    	-- Deklerationsteil für zu übergebende Werte
            @ABH_ID int,
    	@ABH_Benutzer nchar(20), 
            @ABH_Tätigkeit nchar(55),
    	@ABH_Datum date,
    	@ABH_ZeitVon int,
    	@ABH_ZeitBis int,
    	@ABH_Dauer int,
    	@ABH_Gesamt int
    AS
    
    BEGIN
    
    -- Interne Variablen dekleration
    
    -- Eigentlicher code
    
    	Set @ABH_Dauer = @ABH_ZeitBis - @ABH_ZeitVon
    
    -- Wenn Datum Feld leer ist füge das heutige Datum ein, wenn etwas im Feld drinne steht, behalte die Daten
    If @ABH_Datum IS NULL
    	begin
    		set @ABH_Datum = Getdate()
    	End
    
    Else
    	Set @ABH_Datum = @ABH_Datum
    
    If @ABH_Gesamt IS NULL
    	begin
    		With Wochendaten as
    		(
    		Select Benutzer, Dauer, DATEPART(ISO_WEEK, Datum) as KW
    		from Ausbildungsheft
    		)
    		Select Benutzer, KW, Sum(Dauer) as Gesamt
    		from Wochendaten
    		group by Benutzer, KW
    		order by Benutzer, KW
    	;
    	end

    Hier mal die maske aus VB:

    Das Datums feld wird ausgefüllt sobald eine neue Zeile eingefügt wird, Dauer berechnet sich aus "Zeit Von" und "Zeit Bis"

    Jetzt müsste die Gesamt spalte die Dauer zusammen rechnen innerhalb einer Woche von einem User. Zb. wenn in der Tabelle mehrere "hallo" sind vom 6. - 9. Januar das deren Dauer zusammen gerechnet wird und in der Gesamt Spalte als Summe ausgegeben wird.

    Vielen Dank schonmal für die tolle Hilfe soweit :)

    MfG

    Patrick

    Donnerstag, 9. Januar 2014 08:31
  • Hallo Patrick,
    es wäre sicherlich sinnvoll, wenn Du mal etwas zu Deinem Datenmodell erzählen würdest. ich gehe davon aus, dass Du zwei Tabellen hast. Eine für die Tageswerte und eine für die Summen. Wobei Du die Summen auch direkt berechnen könntest, ohne sie abzuspeichern.

    Declare @MeineDaten as Table(Datum date, Userid int, Dauer int);
    Declare @MeineWochenDaten as Table(KW int, Userid int, Dauer int);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 1, 4);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 1, 5);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 1, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 1, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-08', 1, 3);
     Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-02', 2, 2);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-03', 2, 2);
    
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-06', 2, 1);
    Insert into @MeineDaten(Datum, Userid, Dauer) Values ('2014-01-07', 2, 2);
    
    With Wochendaten as
    (
    Select Userid, Dauer, DATEPART(ISO_WEEK, Datum) as KW
    from @MeineDaten
    )
    Insert into @MeineWochenDaten(Userid, KW, Dauer)  
    Select Userid, KW, Sum(Dauer) as Gesamtdauer
    from Wochendaten
    group by Userid, KW
    ;
    
    Select D.Userid, D.Datum, D.Dauer as Tagesstunden, W.KW, W.Dauer as Wochenstunden
    from @MeineDaten D
    left Join @MeineWochenDaten W
    on d.Userid = w.Userid
    and DATEPART(ISO_WEEK, D.Datum) = W.KW
    order by Userid, Datum, KW;
    Je nach gewünschter Logik müsstest Du das noch ausbauen zu einem Update/Merge auf die Wochenstunden, bzw. vorher ein Truncate auf die Wochenstunden absetzen.

    Einen schönen Tag noch,
    Christoph

    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu
    Donnerstag, 9. Januar 2014 12:25
    Beantworter
  • Jap viele Dank :)

    Das hat mir sehr geholfen. Sorry für die späte antwort, ich war die letzten Wochen nicht vor Ort.

    Dienstag, 4. Februar 2014 09:37