Summe von Splaten

Hallo an alle,
es geht um die Kapazitätsermittlung pro Tag.
Habe eine Tabelle die aus einer Spalte Datum besteht und aus Spalten Mitarbeiter.
unter der Spalte Mitarbeiter steht entweder 1 für Arbeitstag und größer 1 für Abwesenheitstage.
Jetzt möchte ich an einem bestimmten Datum, die Anzahl der Mitarbeiter ermitteln die tatsächlich da sind, sprich die Kapazität

Die Tabelle schaut in etwa so aus:

datum|ma_1|ma_2|ma_3|ma_4
2010-06-21|1|2|1|1
2010-06-22|1|2|1|4
2010-06-23|1|2|2|3
2010-06-24|1|1|1|1
2010-06-25|1|2|1|3

Als Ergebis brauch ich also:
3
2
1
4
2

Wie gehts sowas?

Danke schon mal

Gruß
Andreas



est=# select * from ma;
    tag     | ma1 | ma2 | ma3 | ma4
------------+-----+-----+-----+-----
 2010-06-21 |   1 |   2 |   1 |   1
 2010-06-22 |   1 |   2 |   1 |   4
 2010-06-23 |   1 |   2 |   2 |   3
 2010-06-24 |   1 |   1 |   1 |   1
 2010-06-25 |   1 |   2 |   1 |   3
(5 rows)

test=*# select tag, case when ma1=1 then 1 else 0 end + case when ma2 = 1 then 1 else 0 end + case when ma3=1 then 1 else 0 end + case when ma4=1 then 1 else 0 end as anwesend from ma order by tag;
    tag     | anwesend
------------+----------
 2010-06-21 |        3
 2010-06-22 |        2
 2010-06-23 |        1
 2010-06-24 |        4
 2010-06-25 |        2
(5 rows)

Schön ist was anderes, Dein Datenmodel skaliert nicht mehr, wenn die Firma wächst. Und das hoffen wir doch, trotz Krise, oder?

Andreas

Vielen Dank Andreas.
Klar wächst die Firma…hoffen wir doch;-)
Werde die cases über meinScript zsuammensetzten somit ist es wieder skalierbar.


Danke nochmal

gruß
Andreas

Nein. Bei jedem neuen Mitarbeiter hast Du die Tabellendefinition anzupassen. Und sowas skaliert halt nicht.

Andreas

Um genau zu sein bleibt man auf die Art immer ein kleines mittelständisches Unternehmen :wink:
Mehr passen nicht als Spalten in die Tabelle.

Hinzu kommt, dass die Anfragen für irgendwelche Reports irgendwann richtig häßlich werden.

Besser wäre (jetzt nur mit Daten für 2 Tage):

test=*# select tag, count(1) from ma_neu where status=1 group by tag order by tag;
    tag     | count
------------+-------
 2010-06-21 |     3
 2010-06-22 |     2
(2 rows)

test=*# select * from ma_neu ;
    tag     | ma | status
------------+----+--------
 2010-06-21 |  1 |      1
 2010-06-21 |  2 |      2
 2010-06-21 |  3 |      1
 2010-06-21 |  4 |      1
 2010-06-22 |  1 |      1
 2010-06-22 |  3 |      1
 2010-06-22 |  4 |      4
 2010-06-22 |  2 |      2
(8 rows)

test=*# select tag, count(1) from ma_neu where status=1 group by tag order by tag;
    tag     | count
------------+-------
 2010-06-21 |     3
 2010-06-22 |     2
(2 rows)

Du kannst nun 10 oder 100 oder 10.000 Leute einstellen und mußt weder die Tabelle noch die Abfrage ändern. Weg frei für den internationalen Großkonzern!


Andreas