edvkrisch
Goto Top

Einzelne Monatsdateien in einer Jahresauswertungstabelle zusammenfassen

Hallo Zusammen,

ich bin gerade am verzweifeln. Ich habe in einer Access-Datenbank zwölf Tabellen, für jeden Monat eine einzelne. In den Tabellen stehen Mitarbeiter. Es kann passieren das in einem Monat ein Mitarbeiter wegfällt bzw. das ein neuer Mitarbeiter hinzu kommt. In der Jahresauswertungstabelle sollen alle Mitarbeiter aufgelistet werden die während des Jahres in irgendeiner Monatstabelle vorhanden waren. Es sollten allerdings keine Duplikate in dieser Tabelle sein.

Zum Testen habe ich bereits mittels UNION zwei Tabellen miteinander verknüpft nur hab ich keine Ahnung wie ich die Duplikate verhindere.

Syntax: SELECT PersNr FROM 012002 UNION ALL SELECT PersNr FROM 022002;

Benutzt wird übrigens Office 2003

Hoffe mir kann jemand helfen

Gruß

Content-ID: 101678

Url: https://administrator.de/contentid/101678

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

petenicker
petenicker 12.11.2008 um 21:23:21 Uhr
Goto Top
Hallo,

mit der Verknüpfung von zwei oder mehreren Tabellen wirst du nicht glücklich werden. Die einzige Möglichkeit, die ich für dich sehe ist eine Jahrestabelle zu erstellen, die dieselben Felder beinhaltet wie die Monatstabellen. In der Jahrestabelle setzt du einen eindeutigen Index auf die Personalnummer. Dann fügst du alle Datensätze aus den jeweilgen Monatstabellen in die Jahrestabelle ein. Duplikate werden aufgrund des Index nicht übernommen.

Ich befürchte allerdings, dass es nicht nur um die Namen der Mitarbeiter geht, sondern dass eine Art Statistik erstellt werden soll. Gehe ich da Recht mit meiner Annahme? Dafür wäre der Datenbankaufbau mit zwölf Einzeltabellen etwas "unglücklich".

Gruß
Biber
Biber 12.11.2008 um 21:44:07 Uhr
Goto Top
Moin edvKrisch,

willkommen im Forum.

Mir würden mehrere Lösungsstrategien einfallen.

Variante a) Am besten an einem Beispiel.

Wenn drei (Bei-)Spieltabellen existieren
  • namens Jan2008, Feb2008, Mar2008
  • mit jeweils nur den Feldern PersNr und Name
  • und je drei Beispielsätzen
dann würde bei diesem Select
Select Persnr , name, quelle from (
SELECT '01 Jan' as Quelle, Jan2008.Persnr as Persnr, Jan2008.name as name FROM Jan2008  
UNION
SELECT '02 Feb' , Feb2008.Persnr, Feb2008.name  FROM Feb2008  
UNION
SELECT '03 Mar', Mar2008.Persnr , mar2008.name FROM Mar2008  
)

order by persnr, quelle
;
herauskommen:
Persnr	name	quelle
10	Fritz	03 Mar
11	Hans	01 Jan
11	Hans	02 Feb
12	Biber	01 Jan
12	Biber	02 Feb
12	Biber	03 Mar
13	Karl	01 Jan
13	Karl	03 Mar
14	Maria	02 Feb
Persnr 10/Fritz war nur im März in einer der Tabellen, Persnr 14/Maria nur im Feb....usw.
Sollte lesbar sein.

Wenn du alle PersNrn nur einmalig "sehen" willst, dann musst Du alle anderen Daten "aggregieren".
Also z.B.
Select Persnr , name,min(quelle) as [Von:], max(quelle) as [Bis:] from (
SELECT '01 Jan' as Quelle, Jan2008.Persnr as Persnr, Jan2008.name as name FROM Jan2008  
UNION
SELECT '02 Feb' , Feb2008.Persnr, Feb2008.name  FROM Feb2008  
UNION
SELECT '03 Mar', Mar2008.Persnr , mar2008.name FROM Mar2008  
)
GROUP BY persnr, name
order by persnr
;
Ergebnis:
Persnr	name	Von:	Bis:
10	Fritz	03 Mar	03 Mar
11	Hans	01 Jan	02 Feb
12	Biber	01 Jan	03 Mar
13	Karl	01 Jan	03 Mar
14	Maria	02 Feb	02 Feb
[ Soll nur das Prinzip zeigen, ich weiss, dass "karl" nicht durchgängig von Jan-März da war *g]

Wichtig ist im zweiten Statement das GROUP BY auf das Kriterium, das Du nur einmalig (in einer Zeile) sehen willst.

Variante b) die ich persönlich vorziehen würde.

Schick eine PN an den Moderator des Forumsbereichs "Datenbanken".
Der betreibt nämlich hauptberuflich einen florierenden Baseballschläger-Verleih.
Nimm seine Dienste in Anspruch und mach einen Termin mit dem Kasper, der Euch diese "Datenbank" modelliert hat.

Und arbeite ab nächstes Jahr mit einer redesignten Tabellenstruktur.

Grüße
Biber
[Edit] Okay, petenicker hat meine Variante b) schonender rübergebracht, aber auch ich hab mich zurückgehalten...[/Edit]
BigWumpus
BigWumpus 12.11.2008 um 22:41:46 Uhr
Goto Top
Ja !!

b) !!!!

Wer diese Datenbankstruktur entwickelt hat, hat Euch einen Bärendienst erwiesen.
Wahrscheinlich hatte er einfach keine Ahnung und hat seinen Schreibblock mal in Access umgesetzt. Ist ja auch so hübsc einfach.

Eine Datenbasis (Tabelle) für ALLE Jahre und Mitarbeiter !!!
Aus der holst Du mittels Abfragen alles raus.
edvKrisch
edvKrisch 13.11.2008 um 13:33:26 Uhr
Goto Top
Hallo Biber,

erstmal vielen Dank für deinen Vorschlag der funktioniert einwandfrei.

Habe deine Variante B ebenfalls zur Kenntnis genommen und aus den einzelnen Tabellen eine
Jahrestabelle gemacht. Nur steh ich jetzt wieder vor dem Problem wie ich eine Abfrage gestalte das ein Mitarbeiter nicht doppelt enthalten ist. Wenn ich ein einfaches GROUP BY auf die Personalnummer mache heißt es immer diese gehört nicht der Aggregatsfunktion hinzu.

Die Tabelle besteht aus 22 Spalten und mein eindeutiger Index wäre die Personalnummer. Wäre schön wenn du mir nochmal behilflich sein könntest.

Gruß
BigWumpus
BigWumpus 13.11.2008 um 14:04:16 Uhr
Goto Top
In dem ursprünglichen Post gab es Tabellen, in denen Mitarbeiter je Monat aufgeführt waren.

Ich tippe mal auf den Grund, daß man einfach für jeden Monat speichert, wer arbeitete (Personalnummer).
Das wäre für mich genau 1 Spalte: Mitarbeiter

Dann führt man diese 12 Tabellen in eine Tabelle zusammen, so daß man Mitarbeiter und Monat speichert.
Das wären dann 2 Spalten: Mitarbeiter; Monat

Die Abfrage wäre dann einfach eine GROUP-BY-Funktion auf den Mitarbeiter.

Um das alles noch zu toppen, führt man eine 3. Spalte ein in der man das Jahr speichert.


Es entzieht sich allerdings meiner Vorstellungskraft, was das alles soll.
Biber
Biber 13.11.2008 um 14:13:48 Uhr
Goto Top
Moin edvKrisch,

wenn wir da weiterkommen wollen, dann wäre es sinnvoll, wenn Du mal
  • die Struktur oder zumindest die später auswertungsrelevanten Felder der "Jahrestabelle" öffentlich machst
  • und eine Skizze des Auswertung/des Reports, den Du nun am Ende erhalten willst.

Ich gerate ohnehin immer schnell ins weitschweifige Faseln - ein paar feste Punkte im Raum könnten mich davon abhalten.

Grüße
Biber
edvKrisch
edvKrisch 13.11.2008 um 14:53:52 Uhr
Goto Top
Tach Zusammen,

ich versuche mal Licht ins Dunkle zu bringen....

Also ich hab aus den zwölf Monatsdateien eine Gesamttabelle gemacht mit folgendem Aufbau:

AK UN FIL KST PERSNR NAME STRASSE HAUSNR PLZ ORT .....

Die beinhaltet jetzt einen Mitarbeiter evtl. 12mal. Deshalb würde ich gerne darauf jetzt eine Abfrage starten. Mache ich jetzt eine Abfrage SELECT PERSNR FROM Jahr2002 GROUP BY PERSNR hab ich die gewünschte richtige Ansicht aber halt nur die Spalte PERSNR. Deshalb die Frage wie bekomm ich die anderen Spalten hinzu. Irgendwie steh ich grad aufm Schlauch...

Gruß
edvKrisch
petenicker
petenicker 13.11.2008 um 15:28:47 Uhr
Goto Top
Zitat von @edvKrisch:
Tach Zusammen,

ich versuche mal Licht ins Dunkle zu bringen....

Also ich hab aus den zwölf Monatsdateien eine Gesamttabelle
gemacht mit folgendem Aufbau:

AK UN FIL KST PERSNR NAME STRASSE HAUSNR PLZ ORT .....

Die beinhaltet jetzt einen Mitarbeiter evtl. 12mal. Deshalb
würde ich gerne darauf jetzt eine Abfrage starten. Mache ich
jetzt eine Abfrage SELECT PERSNR FROM Jahr2002 GROUP BY PERSNR hab ich
die gewünschte richtige Ansicht aber halt nur die Spalte PERSNR.
Deshalb die Frage wie bekomm ich die anderen Spalten hinzu. Irgendwie
steh ich grad aufm Schlauch...

Gruß
edvKrisch
Dass du nur die Spalte PERSNR bekommst ist klar. Du hast in deiner SELECT Anweisung nur diese Spalte angegeben. Willst du zusätzlich noch den Namen wäre die Syntax
SELECT PERSNR, NAME FROM Jahr2002 GROUP BY PERSNR
Solltest du alle Spalten sehen wollen:
SELECT * FROM Jahr2002 GROUP BY PERSNR
edvKrisch
edvKrisch 13.11.2008 um 15:34:06 Uhr
Goto Top
Genau da ist ja mein Problem, mach ich:

SELECT PERSNR, NAME FROM Jahr2002 GROUP BY PERSNR

Fehler das Name nicht zu meiner Aggregatsfunktion dazugehört.

SELECT * FROM Jahr2002 GROUP BY PERSNR

Fehler mit "*" ausgewählte Felder können nicht gruppiert werden


Gruß
edvKrisch
petenicker
petenicker 13.11.2008 um 15:41:46 Uhr
Goto Top
Sorry, mein Fehler!

Korrekt muss es heißen:
SELECT PERSNR, NAME FROM Jahr2002 GROUP BY PERSNR, NAME
Biber
Biber 13.11.2008 um 17:58:00 Uhr
Goto Top
Hmm, edvKrisch,

so kommen wir nicht voran.
Das Wesen einer Datenbank ist nicht, dass alle Daten in einer flachgeklopften Tabelle vorliegen müssen, damit man/frau die Eins-zu-Eins auf den Drucker schicken kann.
Es muss doch auch bei Dir identifizierende Schlüssel geben, und wenn "PERSNR" ein eindeutiger Schlüssel ist, an dem Name, Vorname, Hausnr und Sternzeichen des Mitarbeiters hängen, dann ist das eine eigene Tabelle.
Ebenso gibt es bestimmt eine Tabelle mit allen Abteilungen, eine mit allen Kostenstellen, meinetwegen auch eine Tabelle mit 12 Sätzen, um alle Monatsnamen im Klartext zu hinterlegen.
Und erst dann kommen wir auf die Bewegungsdaten (die Stunden oder AK pro Monat und Projekt und Kostenstelle).

Bitte erzähl doch noch mal für uns Unwissende:
  • es gibt PERSNRn mit den üblichen Attributen, das hab ich verstanden.
  • und was wird jetzt je PersNr gesammelt? Die Anzahl Arbeitstage je Monat? Oder die Zuordnung eines MA zu einer Kostenstelle?
  • was ist denn in der jetzigen Jahrestabelle der eindeutige Schlüssel, also die Kombination, die nicht doppelt auftreten darf?
  • und WTF ist nun das Ergebnis, dass Du als "Jahresauswertung" erhalten willst (drei Beispielzeilen bitte)?

Grüße
Biber
BigWumpus
BigWumpus 13.11.2008 um 21:13:01 Uhr
Goto Top
Sowas habe ich wieder befürchtet.

Du must die Datenbank "normalisieren" !

Es gibt eine Tabelle "Personal", in der steht jedes Personal genau einmal drin. Jedes Personal hat eine Personalnummer, die ist eindeutig, also ohne Duplikate.

Dann gibt es diese Tabelle "Anwesenheit", darin steht JAHR, MONAT, PERSONALNUMMER.
Mehr braucht es nicht.

Abfrage auf diese Tabelle für ein bestimmtes [Jahr], gruppiert nach Personalnummer ergibt die Liste der Personalnummern, die Du dann in der nächsten Abfrage mit den Daten aus der Tabelle "Personal" verknüpfen kannst.

Ist aber eigentlich sinnlos, das hier zu erklären, weil das in jedem Datenbank-Beispiel auch so erläutert wird.

Normalisieren !