2016-09-19 5 views
1

Ich versuche, Visualisierungen in unserer Produktion zu erstellen. Wir haben zwei Linien mit mehreren hundert Leuten, jede mit unterschiedlichen Schichtstrategien. Ich konnte die Ergebnisse, die ich in Access haben möchte, durch Durchlaufen der Datensätze erzeugen. Ich möchte es auf SQL Server hochskalieren und die Geschwindigkeit verbessern.Berechnen Stunden pro Stunde

Kann mir bitte jemand in die richtige Richtung zeigen?

enter image description here


Hier ist die VBA-Code, der in Access funktioniert.

Public Function MakeLaborData() 

Dim db As dao.Database 
Dim rs As dao.Recordset 
Dim hr As Date 
Dim LaborOn As Date 
Dim LaborOff As Date 
Dim Hours As Double 

Set db = CurrentDb 
Set rs1 = db.OpenRecordset("t_Labor") 'myTable is a MS-Access table created previously 
Set rs2 = db.OpenRecordset("t_Labor_by_Hour") 

Do While Not rs1.EOF 
    LaborOn = rs1.Fields("LABOR_ON").Value 
    If IsNull(rs1.Fields("LABOR_OFF").Value) Then 
     LaborOff = Now() 
    Else 
     LaborOff = rs1.Fields("LABOR_OFF").Value 
    End If 

hr = DateSerial(DatePart("yyyy", LaborOn), DatePart("m", LaborOn), DatePart("d", LaborOn)) + (DatePart("h", LaborOn)/24) 

Do Until hr > LaborOff 
    If LaborOn > hr And LaborOff < hr + 1/24 Then 
    Hours = (LaborOff - LaborOn) * 24 

    ElseIf LaborOn > hr And LaborOff > hr + 1/24 Then 
     Hours = ((hr + 1/24) - LaborOn) * 24 

    ElseIf LaborOn < hr And LaborOff > hr + 1/24 Then 
     Hours = 1 

    ElseIf LaborOn < hr And LaborOff < hr + 1/24 Then 
     Hours = (LaborOff - hr) * 24 

    Else 
     Hours = 0 

    End If 

    With rs2 
    .AddNew 
    !Line_Number = rs1!UNIT 
    !SOI = rs1!JOB 
    !Employee = rs1!Employee 
    !Hour_of_Day = hr 
    !Labor_Hours = Hours 
    .Update 
    End With 

    hr = hr + 1/24 
Loop 



rs1.MoveNext 

Loop 

rs1.Close 
rs2.Close 

End Function 
+1

Zeigen Sie uns Ihre Datenstruktur, Abfrage, die Sie versucht haben, erwartete Ausgabe? Wie können wir Ihnen von einem Screenshot helfen? – artm

+0

OK. Wie lade ich hier einen Beispieldatensatz hoch? –

Antwort

2

Sie können den rekursiven CTE (Rekursiver allgemeiner Tabellenausdruck) verwenden, um eine Sammlung mit Stunden zu generieren.

Als nächstes müssen Sie die Mitarbeiter Daten, wo Stundenzahl zwischen Stunden Arbeit auf und Arbeit aus

nur beitreten Remain CASE hinzufügen WHEN-Klausel Anzahl von Stunden zu berechnen

Schauen Sie sich diese Lösung:

declare @dataTable table(UNIT int, JOB varchar(5), EMPLOYEE nvarchar(50), LABOR_ON datetime2(0), LABOR_OFF datetime2(0)) 
INSERT INTO @dataTable 
(UNIT, JOB, EMPLOYEE, LABOR_ON, LABOR_OFF) 
VALUES 
(398,'W9714',N'Ley',DATETIMEFROMPARTS(2015,12,16,11,46,39,0), DATETIMEFROMPARTS(2015,12,16,12,20,07,0)), 
(398,'WSP06',N'Cervantes',DATETIMEFROMPARTS(2016,01,22,11,30,28,0), DATETIMEFROMPARTS(2016,1,22,12,25,56,0)), 
(398,'DN3RT',N'Miller',DATETIMEFROMPARTS(2015,11,2,13,40,46,0), DATETIMEFROMPARTS(2015,11,2,15,01,12,0)), 
(398,'N04TA',N'Kitzmiller',DATETIMEFROMPARTS(2015,10,20,16,22,02,0), DATETIMEFROMPARTS(2015,10,20,19,06,21,0)), 
(398,'N2C54',N'Blackwell',DATETIMEFROMPARTS(2015,12,14,5,38,30,0), DATETIMEFROMPARTS(2015,12,14,10,34,46,0)), 
(398,'NP02M',N'Perryman',DATETIMEFROMPARTS(2015,10,31,5,20,49,0), DATETIMEFROMPARTS(2015,10,31,12,53,43,0)); 

WITH hourCTE as (SELECT 0 as [HourNo] 
UNION ALL 
SELECT [HourNo] + 1 FROM hourCTE WHERE [HourNo] < 23 
), 
DataWithHours as (
SELECT UNIT 
,JOB 
,EMPLOYEE 
,dateadd(hour,HourNo,cast(cast(LABOR_ON as date) as datetime)) as Hour_of_day 
,LABOR_ON 
,LABOR_OFF 
,hourNo 
FROM hourCTE 
join @dataTable on [HourNo] between DATEPART(HOUR,LABOR_ON) and DATEPART(HOUR,LABOR_OFF)) 

SELECT UNIT 
,JOB 
,EMPLOYEE 
,Hour_of_day 
, 
cast(CASE WHEN DATEPART(HOUR,LABOR_ON) = HourNo 
THEN 
DATEDIFF(SECOND,LABOR_ON,DATEADD(HOUR, 1, Hour_of_day))/cast(3600.0 as decimal) 
WHEN DATEPART(HOUR,LABOR_OFF) = HourNo 
THEN 
DATEDIFF(SECOND,Hour_of_day,LABOR_OFF)/cast(3600.0 as decimal) 
ELSE 
1.000 
END as decimal(6,5)) as Labor_Hours 
FROM DataWithHours 
order by unit, EMPLOYEE, HourNo 
+0

Das ist wirklich vielversprechend Steryd. Es scheint nicht zu funktionieren, wenn jemand bis Mitternacht arbeitet. –

+0

Hey, ich habe es herausgefunden. Danke, dass Sie mich in die richtige Richtung weisen! –

2

ich einen Tisch empfehlen würde, das den Start enthält und Zeit jeder Schicht (Arbeitsperiode) pro Person zu stoppen, so dass, wenn Bob 1,75 Stunden arbeitet, würden Sie eine Zeile für Bob, die um 6.30 Uhr begonnen und hielt um 8:15 Uhr an. Wenn Sie dies innerhalb von drei Arbeitsstunden anzeigen müssen, ist dies ein Präsentationsproblem und kein Datenproblem. Sie können einen Stundentisch zwischen 12 und 12 Uhr haben. Wenn Sie der Stunden-Tabelle mit dieser neuen Tabelle beitreten, erhalten Sie 3 Ergebnisse.

+0

Danke Paul. Ich habe versucht, das Beispiel zu einfach zu machen. Du bist zu 100% korrekt. Es ist ein Anzeige-/Analyseproblem. Wenn ich also den Tisch mit all den Uhrzeiten machen würde, wie würde ich die Stunden in dieser Stunde bekommen? Gibt es eine Möglichkeit, diese Uhrzeittabelle dynamisch in SQL "dynamisch" zu erstellen? –