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

Mitarbeiterauslastung ermitteln

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Christian_T, 4 September 2015.

  1. Christian_T

    Christian_T Benutzer

    Hallo Leute,

    ich habe mal wieder eine Aufgabenstellung, die ich mit einer Stored Procedure auf einem MS SQL-Server lösen möchte.

    Mitarbeitertabelle:
    Spalten: Name
    Daten:
    Meier
    Huber
    Schmidt

    Auslastungstabelle:
    Spalten: Mitarbeitername, Datum
    Daten:
    Meier, 31.08.2015
    Meier, 01.09.2015
    Huber, 03.09.2015

    Gewünschte Ergebnistabelle:
    Spalten: Mitarbeitername, Mo, Di, Mi, Do, Fr
    Daten:
    Meier, beplant, beplant, frei, frei, frei
    Huber, frei, frei, frei, beplant, frei
    Schmidt, frei, frei, frei, frei, frei

    Mir fehlt momentan die Idee, wie ich die Spalten Mo - Fr richtig entweder mit 'beplant' und 'frei' belegen kann.

    Besten Dank im voraus,
    Christian
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Für Deine Daten und aus faulheitsgründen nur für Montag - Donnerstag:

    Code:
    test=*# select * from ma;
      name
    ---------
     meier
     huber
     schmidt
    (3 rows)
    
    Time: 0,158 ms
    test=*# select * from auslastung ;
     name  |  datum
    -------+------------
     meier | 2015-08-31
     meier | 2015-09-01
     huber | 2015-09-03
    (3 rows)
    
    Time: 0,162 ms
    test=*# select name, count(*) filter (where extract(dow from datum) = 1) as montag, count(*) filter (where extract(dow from datum) = 2) as dienstag, count(*) filter (where extract(dow from datum) = 3) as mittwoch, count(*) filter (where extract(dow from datum) = 4) as donnerstag from ma left join auslastung using (name) group by name;
      name  | montag | dienstag | mittwoch | donnerstag
    ---------+--------+----------+----------+------------
     huber  |  0 |  0 |  0 |  1
     meier  |  1 |  1 |  0 |  0
     schmidt |  0 |  0 |  0 |  0
    (3 rows)
    
    FILTER ist SQL-Standard, ich weiß aber nicht, ob M$SQL das schon kann. Falls nicht, herkömmlich formulieren. Siehe select * from depesz; » Blog Archive » Waiting for 9.4 – Implement the FILTER clause for aggregate function calls.
     
    Walter gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    Ich weiß nicht was du immer mit Stored Procedures machen willst, das ist eigentlich nur eine einfache Abfrage (die man natürlich sehr verschieden aufbauen kann).
    Code:
    DECLARE    @woche SMALLINT
    
    SET        @woche = datepart(wk,getdate())
    
    SELECT    m.Name,
            ( CASE WHEN a_Mo.Datum IS NOT NULL THEN 'beplant' ELSE 'frei' END ) AS Mo,
            ( CASE WHEN a_Di.Datum IS NOT NULL THEN 'beplant' ELSE 'frei' END ) AS Di,
            ( CASE WHEN a_Mi.Datum IS NOT NULL THEN 'beplant' ELSE 'frei' END ) AS Mi,
            ( CASE WHEN a_Do.Datum IS NOT NULL THEN 'beplant' ELSE 'frei' END ) AS Do,
            ( CASE WHEN a_Fr.Datum IS NOT NULL THEN 'beplant' ELSE 'frei' END ) AS Fr
    FROM    Mitarbeiter m
    LEFT JOIN Auslastung a_Mo
    ON        m.Name = a_Mo.Mitarbeitername
    AND        datepart(wk,a_Mo.Datum) = @woche
    AND        datepart(weekday,a_Mo.Datum) = 1
    LEFT JOIN Auslastung a_Di
    ON        m.Name = a_Di.Mitarbeitername
    AND        datepart(wk,a_Di.Datum) = @woche
    AND        datepart(weekday,a_Di.Datum) = 2
    LEFT JOIN Auslastung a_Mi
    ON        m.Name = a_Mi.Mitarbeitername
    AND        datepart(wk,a_Mi.Datum) = @woche
    AND        datepart(weekday,a_Mi.Datum) = 3
    LEFT JOIN Auslastung a_Do
    ON        m.Name = a_Do.Mitarbeitername
    AND        datepart(wk,a_Do.Datum) = @woche
    AND        datepart(weekday,a_Do.Datum) = 4
    LEFT JOIN Auslastung a_Fr
    ON        m.Name = a_Fr.Mitarbeitername
    AND        datepart(wk,a_Fr.Datum) = @woche
    AND        datepart(weekday,a_Fr.Datum) = 5
     
    Walter gefällt das.
  4. Distrilec

    Distrilec Datenbank-Guru

    Es gibt auch noch eine dritte Möglichkeit: Die Funktion Pivot (man mag es kaum glauben, aber die ist für sowas gedacht und deswegen (abhängig von der DB) auch am performantesten :) )
    Beispiel werde ich erstmal keins einfügen... Ne Dokumentation solltest du wohl lesen können :)
     
Die Seite wird geladen...

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