Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Komplexe SQL Abfrage oder unmöglich?

Mitglied: marcfr

marcfr (Level 1) - Jetzt verbinden

22.05.2007, aktualisiert 23.05.2007, 4875 Aufrufe, 4 Kommentare

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.
Mitglied: Desperado
23.05.2007 um 21:33 Uhr
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
Bitte warten ..
Mitglied: Desperado
23.05.2007 um 22:42 Uhr
habs nochmal umgeschrieben, jetzt hats mehr dynamik und weniger zeilen ;)

01.
DECLARE @@i Integer 
02.
SET @@i = 1 
03.
DECLARE @@j Integer 
04.
DECLARE @myCol Sysname 
05.
DECLARE @myColRel Sysname 
06.
DECLARE @mySQL Varchar(8000) 
07.
DECLARE @@myArt Varchar(20) 
08.
 
09.
INSERT INTO Wunschtabelle (Datum, Mitarbeiternummer) 
10.
SELECT Datum, Mitarbeiternummer FROM Buchungen WHERE  
11.
(Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer))  
12.
NOT IN (SELECT (Convert(varchar(10), Datum, 104) + Convert(varchar(50), Mitarbeiternummer))  FROM Wunschtabelle) 
13.
GROUP BY Datum, Mitarbeiternummer 
14.
 
15.
WHILE @@i <= 8 
16.
BEGIN 
17.
	SET @myCol = 'kommen' + Convert(sysname, @@i) 
18.
	SET @@MyArt = 'Kommen' 
19.
	SET @@j = @@i - 1 
20.
	SET @myColRel = 'kommen' + Convert(sysname, @@j) 
21.
 
22.
	IF (@@i = 1) 
23.
	BEGIN 
24.
 
25.
		EXEC('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit 
26.
		FROM Buchungen a,  
27.
		Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =  
28.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) 
29.
		AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =  
30.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Art = ''' + @@MyArt + ''') AND a.Art = ''' + @@myArt + '''') 
31.
	END 
32.
 
33.
	IF (@@i > 1) 
34.
	BEGIN 
35.
		EXEC ('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit 
36.
		FROM Buchungen a,  
37.
		Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =  
38.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) 
39.
		AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =  
40.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > ' + @myColRel + ' AND Art = ''' + @@myArt + ''') AND a.Art = ''' + @@myArt + '''') 
41.
	END 
42.
 
43.
	SET @@i = @@i + 1 
44.
END 
45.
 
46.
SET @@i = 1 
47.
 
48.
WHILE @@i <= 8 
49.
BEGIN 
50.
	SET @myCol = 'gehen' + Convert(sysname, @@i) 
51.
	SET @@MyArt = 'Gehen' 
52.
	SET @@j = @@i - 1 
53.
	SET @myColRel = 'gehen' + Convert(sysname, @@j) 
54.
 
55.
	IF (@@i = 1) 
56.
	BEGIN 
57.
 
58.
		EXEC ('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit 
59.
		FROM Buchungen a,  
60.
		Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =  
61.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) 
62.
		AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =  
63.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Art = ''' + @@MyArt + ''') AND a.Art = ''' + @@myArt + '''') 
64.
	END 
65.
 
66.
	IF (@@i > 1) 
67.
	BEGIN 
68.
		EXEC ('UPDATE Wunschtabelle SET ' + @mycol + ' = Zeit 
69.
		FROM Buchungen a,  
70.
		Wunschtabelle b where (Convert(varchar(10), a.Datum, 104) + Convert(varchar(50), a.Mitarbeiternummer)) =  
71.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) 
72.
		AND Zeit = (SELECT Min(Zeit) FROM Buchungen c where (Convert(varchar(10), c.Datum, 104) + Convert(varchar(50), c.Mitarbeiternummer)) =  
73.
		(Convert(varchar(10), b.Datum, 104) + Convert(varchar(50), b.Mitarbeiternummer)) AND Zeit > ' + @myColRel + ' AND Art = ''' + @@myArt + ''') AND a.Art = ''' + @@myArt + '''') 
74.
	END 
75.
	SET @@i = @@i + 1 
76.
END 
77.
 
greetz, desperado
Bitte warten ..
Mitglied: Biber
23.05.2007 um 23:26 Uhr
@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
Bitte warten ..
Mitglied: marcfr
23.05.2007 um 23:47 Uhr
Respekt!!!!!!!!!!!!!!!!
Vielen Dank für die Mühe, damit hätte ich echt nicht gerechnet. Werde mich am We einlesen.

Lg

Marc
Bitte warten ..
Ähnliche Inhalte
PHP
Abfrage SQL
gelöst Frage von dudeldoedelPHP3 Kommentare

Hallo zusammen, kann man das in einer SQL Abfrage erreichen ??? Feldwert lautet: {"565":{"textinput":{"comment":"1400"}}} als Ergebnis soll ausgelesen werden ...

Datenbanken
Hilfe bei SQL Abfrage
gelöst Frage von e51bomagDatenbanken9 Kommentare

Habe einfach eine Denkblockade und würde mich über Hilfe bei einer Datenbankabfrage freuen. Die Abfrage lautet wie folgt: SELECT ...

Windows Server
SQL Abfrage automatisch exportieren
Frage von Andinistrator1Windows Server6 Kommentare

Hallo Zusammen, kurz und knapp: Ich habe eine SQL Abfrage. Diese soll automatisch, z.B. per Agend 1x/Nacht ausgeführt werden. ...

Datenbanken
Hilfe bei SQL-Abfrage
gelöst Frage von emeriksDatenbanken5 Kommentare

Hi, gegeben: MS SQL Server 2005 eine DB mit 3 Tabellen Tabelle "Objekte" 2 Spalten: ID, Name Tabelle "Eigenschaften" ...

Neue Wissensbeiträge
Vmware
VMware Update für den ESXi 5.5 verfügbar
Information von sabines vor 22 StundenVmware

Nach dem ganzen Hickhack um Update mit Microcode Anpassungen und Rückzug, gibt es nun für den ESXi 5.5 ein ...

CPU, RAM, Mainboards

Meltdown und Spectre: Intel zieht Microcode-Updates für Prozessoren zurück

Information von keine-ahnung vor 1 TagCPU, RAM, Mainboards6 Kommentare

Moin, extrem lutztig. Nur gut, dass ich noch nicht beim Probanden-Bingo mitgemacht habe :-) LG, Thomas

Router & Routing
PfSense als Addon auf QNAP
Information von magicteddy vor 1 TagRouter & Routing7 Kommentare

Moin, für Spielereien eine ganz nette Idee aber ich fürchte das soetwas auch als echte Firewall genutzt wird: In ...

Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 1 TagDatenschutz1 Kommentar

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement26 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Server
TEMP-Profile
gelöst Frage von Forseti2003Windows Server21 Kommentare

Guten Morgen, wer kennt sie nicht, die lieben Temporären Benutzerprofile, vorallem immer dann, wenn man sie am wenigsten braucht. ...

LAN, WAN, Wireless
100m+ Leitungslänge Ethernet
gelöst Frage von Ex0r2k16LAN, WAN, Wireless16 Kommentare

Guten Morgen zusammen, ich habe eine Netzwerkdose die die 100m Leitungslänge bis zum Switch knackt. Damit die Verbindung einigermaßen ...

Multimedia & Zubehör
Welches Tablet für die Verkäufer?
Frage von Hendrik2586Multimedia & Zubehör16 Kommentare

Guten Morgen meine Lieben, vielleicht könnt ihr mir ja helfen. Es geht um unsere Außendienstmitarbeiter /Verkäufer. Sie sollen demnächst ...