Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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?

Frage Entwicklung Datenbanken

Mitglied: marcfr

marcfr (Level 1) - Jetzt verbinden

22.05.2007, aktualisiert 23.05.2007, 4823 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Datenbanken
SUM oder AVG in SQL Abfrage dauert viel zu lange warum? (5)

Frage von samet22 zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage mit MAX() (9)

Frage von FrAmEr zum Thema Datenbanken ...

Datenbanken
gelöst Schleifen in SQL-Abfrage bei 2 Tabellen (2)

Frage von Aximand zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...