Komplexe SQL Abfrage oder unmöglich?
Hallo,
ich habe folgendes problem:
Ich habe eine Zeiterfassungshardware, die mir alle einzelnen Buchungen pro Mitarbeiter mit der Art (kommen oder gehen) liefert. Nun möchte ich die einzelnet Buchungen pro Tag in einer Zeile zusammenfasen. Bei nur 2 Buchungen ist das ja kein problem (suche nach datensätzen, in denen die Mitarbeiternummer und das Datum gleich ist), aber falls der Mitarbeiter mal Pause macht, (was ihm zusteht habe ich pro tag 4 Buchungssätze. Maximal 8 Buchungen sollen berücksichtigt werden. Hatt jemand ne Ahnung wie ich das machen kann, am besten mit einer SQl abfrage, oder zumindest einen logischen Ansatz? Das ganze wird mit open office Base realisiert.
Lg
Marc
Tabelle Buchungen:
ID;Mitarbeiternummer;Art;Datum;Zeit
Meine Wunschtabelle/Abfrage:
Datum;Mitarbeiternummer;kommen1;gehen1;kommen2;gehen2 usw.
ich habe folgendes problem:
Ich habe eine Zeiterfassungshardware, die mir alle einzelnen Buchungen pro Mitarbeiter mit der Art (kommen oder gehen) liefert. Nun möchte ich die einzelnet Buchungen pro Tag in einer Zeile zusammenfasen. Bei nur 2 Buchungen ist das ja kein problem (suche nach datensätzen, in denen die Mitarbeiternummer und das Datum gleich ist), aber falls der Mitarbeiter mal Pause macht, (was ihm zusteht habe ich pro tag 4 Buchungssätze. Maximal 8 Buchungen sollen berücksichtigt werden. Hatt jemand ne Ahnung wie ich das machen kann, am besten mit einer SQl abfrage, oder zumindest einen logischen Ansatz? Das ganze wird mit open office Base realisiert.
Lg
Marc
Tabelle Buchungen:
ID;Mitarbeiternummer;Art;Datum;Zeit
Meine Wunschtabelle/Abfrage:
Datum;Mitarbeiternummer;kommen1;gehen1;kommen2;gehen2 usw.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 59562
Url: https://administrator.de/forum/komplexe-sql-abfrage-oder-unmoeglich-59562.html
Ausgedruckt am: 23.12.2024 um 15:12 Uhr
4 Kommentare
Neuester Kommentar
Das größte Problem ist der fehlende Primary Key Erstell Deine Wunschtabelle im beschriebenen Format und dann führ das aus:
INSERT INTO Wunschtabelle (Datum, Mitarbeiternummer)
SELECT Datum, Mitarbeiternummer FROM Buchungen WHERE
(Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer))
NOT IN (SELECT (Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer)) FROM Wunschtabelle)
GROUP BY Datum, Mitarbeiternummer
UPDATE Wunschtabelle SET kommen1 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)))
UPDATE Wunschtabelle SET gehen1 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen1)
UPDATE Wunschtabelle SET kommen2 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > gehen1)
UPDATE Wunschtabelle SET gehen2 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen2)
UPDATE Wunschtabelle SET kommen3 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > gehen2)
UPDATE Wunschtabelle SET gehen3 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen3)
UPDATE Wunschtabelle SET kommen4 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > gehen3)
UPDATE Wunschtabelle SET gehen4 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen4)
usw.....
ich bin mal davon ausgegangen, dass wenn einer kommt, er auch wieder geht und dann erst wieder kommt ;)
wenn einer zweimal kommt (hö?), einfach in die where-bedingung noch die art hinzufügen...
Greetz, Desperado
INSERT INTO Wunschtabelle (Datum, Mitarbeiternummer)
SELECT Datum, Mitarbeiternummer FROM Buchungen WHERE
(Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer))
NOT IN (SELECT (Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer)) FROM Wunschtabelle)
GROUP BY Datum, Mitarbeiternummer
UPDATE Wunschtabelle SET kommen1 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)))
UPDATE Wunschtabelle SET gehen1 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen1)
UPDATE Wunschtabelle SET kommen2 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > gehen1)
UPDATE Wunschtabelle SET gehen2 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen2)
UPDATE Wunschtabelle SET kommen3 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > gehen2)
UPDATE Wunschtabelle SET gehen3 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen3)
UPDATE Wunschtabelle SET kommen4 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > gehen3)
UPDATE Wunschtabelle SET gehen4 = Zeit FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > kommen4)
usw.....
ich bin mal davon ausgegangen, dass wenn einer kommt, er auch wieder geht und dann erst wieder kommt ;)
wenn einer zweimal kommt (hö?), einfach in die where-bedingung noch die art hinzufügen...
Greetz, Desperado
habs nochmal umgeschrieben, jetzt hats mehr dynamik und weniger zeilen ;)
greetz, desperado
DECLARE @@i Integer
SET @@i = 1
DECLARE @@j Integer
DECLARE @myCol Sysname
DECLARE @myColRel Sysname
DECLARE @mySQL Varchar(8000)
DECLARE @@myArt Varchar(20)
INSERT INTO Wunschtabelle (Datum, Mitarbeiternummer)
SELECT Datum, Mitarbeiternummer FROM Buchungen WHERE
(Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer))
NOT IN (SELECT (Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer)) FROM Wunschtabelle)
GROUP BY Datum, Mitarbeiternummer
WHILE @@i <= 8
BEGIN
SET @myCol = 'kommen' + Convert(sysname, @@i)
SET @@MyArt = 'Kommen'
SET @@j = @@i - 1
SET @myColRel = 'kommen' + Convert(sysname, @@j)
IF (@@i = 1)
BEGIN
EXEC('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit
FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Art = ''' + @@MyArt + ''') AND a.Art = ''' + @@myArt + '''')
END
IF (@@i > 1)
BEGIN
EXEC ('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit
FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > ' + @myColRel + ' AND Art = ''' + @@myArt + ''') AND a.Art = ''' + @@myArt + '''')
END
SET @@i = @@i + 1
END
SET @@i = 1
WHILE @@i <= 8
BEGIN
SET @myCol = 'gehen' + Convert(sysname, @@i)
SET @@MyArt = 'Gehen'
SET @@j = @@i - 1
SET @myColRel = 'gehen' + Convert(sysname, @@j)
IF (@@i = 1)
BEGIN
EXEC ('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit
FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Art = ''' + @@MyArt + ''') AND a.Art = ''' + @@myArt + '''')
END
IF (@@i > 1)
BEGIN
EXEC ('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit
FROM Buchungen a,
Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer))
AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =
(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > ' + @myColRel + ' AND Art = ''' + @@myArt + ''') AND a.Art = ''' + @@myArt + '''')
END
SET @@i = @@i + 1
END
greetz, desperado
@Desperado
Klasse. *verneig*
Gerade wollte ich ihm posten, dass es zwar machbar wäre, aber nicht mit einer Abfrage/nicht ohne persistierte Daten in einer neuen Tabelle.
[Es sei denn, man/frau wäre verrückt genug, mit 5 SubSelects und "where zeit NOT IN ..." rumzuhampeln].
Ich würde dennoch überprüfen, ob die Anforderung Sinn macht (also die getrennte Ausweisung der 8 Kommt/Geht-Zeiten) oder ob es nicht reicht, die erste Kommt-, die letzte Geht-, die Anwesenheits- und die Nicht-Anwesenheitszeit als 4 Spalten anzuzeigen.
Das ginge nämlich wahrscheinlich auch ohne Verrenkungen in einer Abfrage mit "GROUP BY Mitarbeiter, Tag(Datum)".
Anerkennende Grüße
Biber
Klasse. *verneig*
Gerade wollte ich ihm posten, dass es zwar machbar wäre, aber nicht mit einer Abfrage/nicht ohne persistierte Daten in einer neuen Tabelle.
[Es sei denn, man/frau wäre verrückt genug, mit 5 SubSelects und "where zeit NOT IN ..." rumzuhampeln].
Ich würde dennoch überprüfen, ob die Anforderung Sinn macht (also die getrennte Ausweisung der 8 Kommt/Geht-Zeiten) oder ob es nicht reicht, die erste Kommt-, die letzte Geht-, die Anwesenheits- und die Nicht-Anwesenheitszeit als 4 Spalten anzuzeigen.
Das ginge nämlich wahrscheinlich auch ohne Verrenkungen in einer Abfrage mit "GROUP BY Mitarbeiter, Tag(Datum)".
Anerkennende Grüße
Biber