Mitarbeiterauslastung ermitteln

Christian_T

Benutzer
Beiträge
8
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
 
Werbung:
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.
 
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
 
Werbung:
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 :)
 
Zurück
Oben