Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abwesenheitszeiten multiplizieren

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von fasp84_neuling, 25 Oktober 2014.

  1. fasp84_neuling

    fasp84_neuling Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Um ehrlich zu sein: Bahnhof.

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

    akretschmer Datenbank-Guru

    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)
    
     
  4. fasp84_neuling

    fasp84_neuling Neuer Benutzer

    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
     
  5. Hony%

    Hony% Datenbank-Guru

    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
     
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...
Ähnliche Themen - Abwesenheitszeiten multiplizieren
  1. Ben2003
    Antworten:
    3
    Aufrufe:
    300
  2. wuumbs
    Antworten:
    2
    Aufrufe:
    1.284

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden