Abwesenheitszeiten multiplizieren

fasp84_neuling

Neuer Benutzer
Beiträge
2
Guten Abend zusammen,
ich bin ein Laie im SQL und daher wende ich mich mal hoffnungsvoll an die Profis.

Folgendes Szenario habe ich für eine Berechnung von Verpflegungsaufwand aufgebaut:

tbl_Abwesenheit [Reisename] ,[Abwesenheit] ,[Land] ,[Aufwand]

Dort befülle ich den Reisenamen, die Abwesenheit wird in Stunden mit einem Datediff berechnet, das Land wird ebenfalls übergeben und der Aufwand soll ein Rechenergbnis sein. Der Wert soll sich ergeben aus der Abwesenheit (h) und dem Faktor aus folgender Tabelle:

tbl_Verpflegungsaufwand [Land] ,[Satz 1 (8-24)] ,[Satz 2 (24)]
Dort findet sich zum einen das Land wieder, aber auch der Satz bei einer Abwesenheit von 8-24 h oder eben ab 24 h

Nun möchte ich erreichen, dass SQL mir folgendes beispielsweise ausrechnet:
- 96 Stunden Abwesenheit in Belgien (glatte 4 Tage)
- 95 Stunden Abwesenheit in Belgien ( 3 Tage und 23 Stunden) -> 3x "Satz2" und 1x "Satz1"

Ist das für Euch Profis realisierbar? Oder muss ich dazu irgendwie die Tabellen umbauen?

Würde mich freuen, ein Feedback von Euch zu bekommen.

Viele Grüße und vielen Dank vorab

Fabian
 
Werbung:
tbl_Abwesenheit [Reisename] ,[Abwesenheit] ,[Land] ,[Aufwand]

Dort befülle ich den Reisenamen, die Abwesenheit wird in Stunden mit einem Datediff berechnet, das Land wird ebenfalls übergeben und der Aufwand soll ein Rechenergbnis sein. Der Wert soll sich ergeben aus der Abwesenheit (h) und dem Faktor aus folgender Tabelle:

tbl_Verpflegungsaufwand [Land] ,[Satz 1 (8-24)] ,[Satz 2 (24)]
Dort findet sich zum einen das Land wieder, aber auch der Satz bei einer Abwesenheit von 8-24 h oder eben ab 24 h

Nun möchte ich erreichen, dass SQL mir folgendes beispielsweise ausrechnet:
- 96 Stunden Abwesenheit in Belgien (glatte 4 Tage)
- 95 Stunden Abwesenheit in Belgien ( 3 Tage und 23 Stunden) -> 3x "Satz2" und 1x "Satz1"

Ist das für Euch Profis realisierbar? Oder muss ich dazu irgendwie die Tabellen umbauen?

Um ehrlich zu sein: Bahnhof.

Mir schweben Dinge wie JOIN und COALESCE vor den Augen...
 
Um ehrlich zu sein: Bahnhof.

Mir schweben Dinge wie JOIN und COALESCE vor den Augen...

Sowas?

Code:
test=*# select * from abwesend ;
  land  |  name  | dauer
---------+---------+-------
 Belgien | Mueller |  95
 Belgien | Meier  |  96
(2 rows)

Time: 0,150 ms
test=*# select * from aufwand ;
  land  | satz1 | satz2
---------+-------+-------
 Belgien |  68 |  57
(1 row)

Time: 0,146 ms
test=*# select au.*, ab.*, ab.dauer / 24 * au.satz1 + case when ab.dauer % 24 > 1 then au.satz2 else 0 end  from aufwand au left join abwesend ab on au.land=ab.land;
  land  | satz1 | satz2 |  land  |  name  | dauer | ?column?
---------+-------+-------+---------+---------+-------+----------
 Belgien |  68 |  57 | Belgien | Mueller |  95 |  261
 Belgien |  68 |  57 | Belgien | Meier  |  96 |  272
(2 rows)
 
Hallo akretschmer,
vielen Dank für Deine Mühe :)
Ich habe Deinen String einmal angepasst in:

select [tbl_Verpflegungsaufwand].*, [tbl_Abwesenheit].*, tbl_Abwesenheit.Abwesenheit / 24 * tbl_Verpflegungsaufwand.[824]] + case when tbl_Abwesenheit.Abwesenheit % 24 > 1 then tbl_Verpflegungsaufwand.[24] else 0 end from tbl_Verpflegungsaufwand left join tbl_Abwesenheit on tbl_Verpflegungsaufwand.Land=tbl_Abwesenheit.Land;

und bekomme eine Fehlermeldung:
Meldung 156, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe des else-Schlüsselworts

Kannst Du anhand des Strings den Fehler erkennen, habe jetzt einiges herum probiert - aber mag mich nicht.

Danke Dir, für das Skript und die Hilfe

Fabian
 
Hi fast84.

Da du die Abwesenheit in deinem Beispiel nur mit einem Attribut angibst gehe ich davon aus, dass der Wert bereits in Stunden vorliegt. @akretschmer war mit seinem Vorschlag etwas schneller. Trotzdem hier eine alternative Lösung:

Code:
SELECT A.*,
(A.Abwesenheit % 24 * V.Satz1) +
(CAST(A.Abwesenheit / 24 AS INTEGER) * 24 * V.Satz2) AS Aufwand
FROM tbl_Abwesenheit AS A
INNER JOIN tbl_Verpflegungsaufwand AS V
ON A.Land = V.Land
Der Cast muss gegebenenfalls für MS-SQL angepasst werden, da ich das auf die schnelle in SQLite getestet habe. Normalerweise ist er auch nicht nötig, da bei einer Division eines Integers mit einem Integer auch ein Integer heraus kommen sollte.

Gruß
Hony
 
Werbung:
Wenn du Verpflegungsmehraufwand steuerrechtlich relevant errechnen möchtest wirst du mit deinem Modell ein ganz grundlegendes Problem bekommen. Du speicherst direkt das datediff() Ergebnis in Stunden als Abwesenheit. Die Berechnung der pauschalen für Verpflegungsmehraufwand betrachtet aber die Abwesenheitszeit immer Tagesweise, also werden An- und Abreisetage erstmal für sich genommen bewertet. Wenn du hier 2x 9h zugrunde legst, sind das mit deiner Methode 18h also 12 Euro. In Wahrheit bekommst du aber für 2 Tage a 9h Abwesenheit 2x 12 Euro weil 2x über 8h.

Ich rate dir also dringend erstmal die kompletten Datetime Werte zu speichern. Dann würde ich immer Tag 1 und letzter Tag gesondert bewerten und die Tage dazwischen mit dem vollen Tagessatz bewerten. Das geht alles recht einfach mit einem Join und in einer Abfrage.
 
Zurück
Oben