Zeilen -> Spalten

Hi…

Ich versuche gerade, die Daten aus unserer Zeiterfassung in eine brauchbare Form zu bekommen. Ausgangspunkt ist eine CSV-Tabelle dieser Form:

Datum,Projekt,Mitarbeiter,Arbeitszeit

Das bekomme ich relativ problemlos in Openoffice Base oder sqlite3 importiert. Aber dann weiß ich leider überhaupt nicht weiter.

Das gewünschte Endergebnis sieht so aus:

 Mitarb1 Mitarb2 Mitarb3 ... Summe
Projekt1 3.0 5.0 0.0 8.0
Projekt2 1.0 0.0 0.5 1.5 
...

Ist das mit SQL überhaupt vernünftig zu machen, oder würde ich mich mit meinetwegen Perl oder gar awk leichter tun?

genumi

Moin moin,

Mitarb1 Mitarb2 Mitarb3 … Summe
Projekt1 3.0 5.0 0.0 8.0
Projekt2 1.0 0.0 0.5 1.5

Das ist eine Ansicht, hat also wenig mit einer Datenhaltung zu tun.
Und ja du kannst dir das alles Zusammenbasteln mit SQL Views .

Ist das mit SQL überhaupt vernünftig zu machen, oder würde ich
mich mit meinetwegen Perl oder gar awk leichter tun?

Einfacher mag es vielleicht sein , die Ausgabe mit anderen FrontEnds zu organisieren. Oder brauchst du das als fertige Tabelle :smile:

Etwas mehr Beschreibung wo zu das dient wäre hiflreich.

Denormalisierung
Moin, genumi,

Ist das mit SQL überhaupt vernünftig zu machen

ich sage ganz vorsichtig nein, weil sich mit SQL-Mitteln keine Darstellung erzeugen lässt, die gegen die 1. Normalform verstößt. Ganz vorsichtig, weil sich immer wieder DBMS-Hersteller damit hervortun, dem Kunden Erweiterungen anzubieten, die es vielleicht doch können.

oder würde ich
mich mit meinetwegen Perl oder gar awk leichter tun?

Mit Excel geht das ganz simpel: Transponieren leistet genau das.

Gruß Ralf

Hi,

um das in SQL zu lösen muss man ein bisschen was über dynamisches SQL wissen. Die Summentabelle würde ich in einer Stored Procedure anlegen:

Schleife über die Mitarbeitertabelle
alter table Summentabelle add column Mitarbeitername;
Ende-Schleife;

Zur Befüllung der Sumentabelle:

Schleife über die Arbeiten:
set @feldname = Mitarbeitername;
update Sumentabelle set @feldname = @feldname + Arbeitszeit
where Summentabelle.Projekt = Arbeiten.Projekt ;
Ende Schleife;

Das wäre der grobe Ablauf, Initialisierungen sind noch durchzuführen und die passende Syntax ist noch zu finden.

Gruß Fralang

Hi…

Mitarb1 Mitarb2 Mitarb3 … Summe
Projekt1 3.0 5.0 0.0 8.0
Projekt2 1.0 0.0 0.5 1.5

Das ist eine Ansicht, hat also wenig mit einer Datenhaltung
zu tun.
Und ja du kannst dir das alles Zusammenbasteln mit SQL Views .

Bisher hab ich den Weg dorthin nicht gefunden - das mag damit zusammenhängen, daß ich bisher nicht viel Ahnung von SQL habe…

Ist das mit SQL überhaupt vernünftig zu machen, oder würde ich
mich mit meinetwegen Perl oder gar awk leichter tun?

Einfacher mag es vielleicht sein , die Ausgabe mit anderen
FrontEnds zu organisieren. Oder brauchst du das als fertige
Tabelle :smile:

Etwas mehr Beschreibung wo zu das dient wäre hiflreich.

Gern.
Unsere Zeitauswertung kann direkt verschiedene Reports ausgeben, aber nicht den, den ich brauche. Deswegen exportiere ich alle Arbeitszeitdaten als CSV und versuche das dann in die gewünschte Form zu bringen. Eventuell gibt es später mal die Möglichkeit, direkt auf die Datenbank zuzugreifen, aber das wäre nur eine Arbeitserleichterung und hat nichts mit meinem eigentlichen Problem zu tun.

Es soll pro Projekt aufsummiert werden, welcher Mitarbeiter wieviele Stunden daran gearbeitet hat. Dazu kommt aus einer anderen Tabelle, wieviel Arbeitszeit ursprünglich für das gesamte Projekt kalkuliert war. Das Ganze wird dann sortiert nach der Abweichung von der geplanten Zeit.

Zweck 1: Bei starken Zeitüberschreitungen sollen die Projektunterlagen überprüft werden, um festzustellen, woran es gelegen hat. Mittelfristig soll diese Prüfung bei größeren Projekten auch zwischendurch möglich sein, um frühzeitig zu erkennen, wenn die Sache aus dem Ruder läuft.

Zweck 2: Bei Zeitunterschreitungen sind Bonuszahlungen an die Mitarbeiter geplant, die sich nach der Beteiligung der jeweiligen MA am Projekt richten.

Diese Auswertungen glaube ich hinzukriegen, aber ich hänge erstmal am oben beschriebenen Übergang.

genumi