Wie kann ich eine fortgeschrittene Verarbeitung auf meinem DB effektiv durchführen?

Ich entwickle eine Timesheet-Anwendung mit SQL server als mein Backend und ich versuche, herauszufinden, die beste Art und Weise zu behandeln relativ komplexe Verarbeitung Logik in meinem DB für Berichterstattung Zwecke.

Ich habe einen Tisch (timesheet_entries), der sich aus folgenden Feldern zusammensetzt:

  • entry_id

  • Angestellten ID

  • Job-ID

  • job_state

  • pto_code (das bedeutet, dass der Eintrag Paid Time Off ist und die ID von welcher Art von PTO – Urlaub, Sick, etc – das ist. Es ist immer NULL, wenn job_id bevölkert ist und umgekehrt)

  • Beitrittsdatum

  • Gesamtstunden

  • ot_exempt (ein boolescher Wert, der bestimmt, ob der Eintrag in den Überstundensummen berechnet werden soll)

Ich muss einen Bericht erstellen, der eine Zusammenfassung der time für jeden Mitarbeiter, der nach dem Staat aufgeschlüsselt ist, geben kann. Ich weiß, dass ich das ganz einfach mit einem SUM (total_hours) und GROUP BY job_state machen kann, aber ich die Art, wie ich Überstunden berechnen muss, hat eine ziemlich spezifische Logik dazu.

Zuerst muss ich die Gesamtzahl der Stunden für jeden Mitarbeiter für einen bestimmten timeraum berechnen. Als nächstes muss ich jede time subtrahieren, die entweder als PTO markiert ist oder OT Exempt, um mir meine gesamte reguläre Stunden zu bekommen. Von dort aus kann ich beginnen, irgendwelche der regulären Stunden zu zählen, die über 40 Stunden in einer Woche in Überstunden sind. Was mich für mich wirklich schwierig macht, ist, dass ich in der Lage sein muss, OT durch den Zustand zu berechnen, in dem es gesammelt wurde, indem er im Wesentlichen verfolgt, welcher Eintrag (geordnet durch entry_date) die regulären Stunden des Benutzers über 40 drückt und dann sicher, dass ich damit anfange, den OT zu sammeln Für den Zustand ist der jeweilige Job in (job_state).

Zum Beispiel, wenn man seine ersten 35 Stunden für die Woche in einem Job in NC arbeitet und dann die nächsten 15 auf Job im SC verbringt, müsste der Report so etwas wie folgendes zeigen:

Mitarbeiter Name / Job Status / Reg Stunden / OT Stunden

Smith, John / NC / 35/0

Smith, John / SC / 5/10

Und wenn Sie das sagen würden, nachdem er die 15 Stunden auf dem SC-Job gearbeitet hatte, begann er, an einem anderen Job in NC zu arbeiten, er musste anfangen, OT in NC zu beginnen, da er bereits über 40 reguläre Stunden in einer Woche sein würde. Für den Fall, dass John Smith die Woche beendet hat, indem er weitere 15 Stunden in NC arbeitet, würde sein Abschlussbericht wie folgt aussehen:

Mitarbeiter Name / Job Status / Reg Stunden / OT Stunden

Smith, John / NC / 35/15

Smith, John / SC / 5/10

Ich bin mir ziemlich sicher, dass dies etwas ist, das nicht mit regelmäßigem SQL erreicht werden kann. Muss ich eine UDF verwenden oder so etwas, um diese Aufgabe zu erfüllen? Wenn ich bedenke, dass ich mit den einfachen Einsendungen lieber die Einsendungen eines Mitarbeiters erhalten kann, kann ich das Ergebnis in die UDF insert, um das gewünschte Ergebnis zu verarbeiten und dann auszugeben? Wenn nicht, müsste ich nur die SQL-statement innerhalb der UDF einbinden und ausführen?

Wenn jemand irgendwelche Gedanken auf dem besten path hat, könnte ich diese Aufgabe erfüllen, würde ich es sehr schätzen.

-Mike

Geschäftslogik gehört in die Business-Schicht. Ich denke, das ist wohl ein bisschen zu viel in SQL gelegt werden (auch wenn es möglich ist).

Sie können dies mit mehreren Abfragen innerhalb eines Benutzers gespeicherte Prozedur (sp) tun. Sie können mehrere Ergebnismengen auf Ihren ASP.Net-Code zurückgeben, der von einem DataSet mit DataTables in ASP.Net verbraucht werden soll. Dann können Sie das verwenden, um Ihren Bericht zu erstellen.

Dies wäre wahrscheinlich am besten in Code behandelt. Was Sie brauchen, um zu betrachten sind Service-Busse, nicht fancy T-SQL.

Vergessen Sie nicht CLR Gespeicherte Prozeduren . Sie können schreiben .NET DLLs, die in Ihre SQL server 2005+ database geladen werden, um als gespeicherte Prozeduren ausgeführt zu werden. Logik, wie Sie beschreiben, ist wahrscheinlich einfacher mit einer .NET-Sprache (zB C #) als TSQL zu implementieren.