Join des Todes

Termos

Mitglied
Hallo Community,

ich bin gerade mit einer Abfrage inkl Joins beschäftigt die mir den letzten nerv raubt.

Aufbau der Tabellen:
_____________________________________________________________________________

Personal:

Personal
Abteilung
seit
Bis
Dienstplan

Woplan:

Dienstplan
(Mo - So wird in der Where Bedingung mit Tagesmodelle verglichen)
Montag
Dienstag
Mittwoch
Donnerstag
Freitag
Samstag
Sonntag


Tagesmodelle:


Modelle (Hier gibt es 30 Attribute die in der Where Bedingung abgefragt werden)


Datum:

Datum (Hier stehen alle Tage im Format yyyy-mm-dd von 2006 bis 2020 drin
___________________________________________________________________________________


Was Soll raus kommen:

Ziel ist es einen Mitarbeiter mit jedem Tag im unternehmen zu Historisieren. Dafür benutze ich seit und bis und die Tabelle Datum.

SQL:
SELECT p.personal, p.abteilung, d.datum 
FROM Personal p join datum d on (d.datum between p.SEIT AND p.BIS)

Damit habe ich die Tabelle mit allen Mitarbeitern und deren Abteilung an Tag x.
Nun muss ich zu jedem Tag den richtigen Woplan hinzufügen.

SQL:
SELECT p.personal, p.abteilung, d.datum, Tagesmodell 
FROM Personal2 p join datum d on (d.datum between p.SEIT AND p.BIS)join woplan w on p.DIENSTPLAN = w.DIENSTPLAN, TAGESMODELL t 
WHERE w.MOTM = t.Tagesmodell

UNION ALL

SELECT p.personal, p.abteilung, d.datum, Tagesmodell 
FROM Personal2 p join datum d on (d.datum between p.SEIT AND p.BIS)join woplan w on p.DIENSTPLAN = w.DIENSTPLAN, TAGESMODELL t 
WHERE w.DITM = t.Tagesmodell

.
.
.
Für Alle Tage


Hier kommt es dazu das er Jede Person mit jedem woplan verknüpft.



Am Ende soll die Abfrage folgendes Ausgeben:


Mitarbeiter || Abteilung des Mitarbeiters || Datum || Tagesmodell
A TXL 01.01.2010 V
A TXL 02.01.2010 V
A TXL 03.01.2010 V
A TXL 04.01.2010 V
A TXL 05.01.2010 WE
B THX 01.01.2010 Früh
B THX 01.01.2010 Früh
B THX 01.01.2010 Früh
B TGC 01.01.2010 Früh
B TGC 01.01.2010 Früh
.
.
.



Hat wer ne Idee wie ich das richtig Joine?
Es gibt Tage wo kein Tagesmodell vorhanden ist ... diese sollten dann mit NULL Angezeigt werden.
 
item: MySQL?

item: Am besten normalisierst du die Dienstplan-Tababelle:
dienstplan / wtag / tagesmodel
Wobei bei wtag die Nummer des Wochentags gem. MySQL-Funktion weekday() ist

SQL:
SELECT dienstplan, 0 AS wtag, motm AS tagesmodell FROM woplan
UNION ALL SELECT dienstplan, 1, ditm FROM woplan
UNION ALL SELECT dienstplan, 2, mitm FROM woplan
UNION ALL SELECT dienstplan, 3, dotm FROM woplan
UNION ALL SELECT dienstplan, 4, frtm FROM woplan
UNION ALL SELECT dienstplan, 5, satm FROM woplan
UNION ALL SELECT dienstplan, 6, sotm FROM woplan

Auf diesem aufbauend musst du nachher nicht mehr alle Grossen Abfragen mittels UNION anhängen.

item: Dann vermisse ich in deinem SQL irgendwo das auslesen des Wochentags selber.

item: Ungetestet denke ich, dass du etwa sowas willst
SQL:
SELECT
	p.personal, 
	p.abteilung, 
	d.datum, 
	t.tagesmodell 
FROM
	personal p,
	datum d,
	tagesmodell t,
	(
		SELECT dienstplan, 0 AS wtag, motm AS tagesmodell FROM woplan
		UNION ALL SELECT dienstplan, 1, ditm FROM woplan
		UNION ALL SELECT dienstplan, 2, mitm FROM woplan
		UNION ALL SELECT dienstplan, 3, dotm FROM woplan
		UNION ALL SELECT dienstplan, 4, frtm FROM woplan
		UNION ALL SELECT dienstplan, 5, satm FROM woplan
		UNION ALL SELECT dienstplan, 6, sotm FROM woplan
	) dplan
WHERE
	d.datum BETWEEN p.seit AND p.bis
	AND WEEKDAY(d.datum) = dplan.wtag
	
	AND p.dienstplan = dplan.dienstplan
	AND t.tagesmodell = dplan.tagesmodell

PS: Dein Titel ist völlig falsch. Dieser Join ist weit weg des Todes
 
Zuletzt bearbeitet von einem Moderator:
Ich bin sowas von entsetzt in welch kurzer Zeit du das Problem durchschaut und gelöst hast ;O

Auf die Idee mit dem Tag = Tag bin ich noch gekommen, aber die Umsetzung - Wahnsinn******!



Vielen vielen Dank


Die Wochentage an sich lese ich über Datum aus.



Es klappt jetzt , vielen DANK
 
Zurück