Benutzer mit den meisten Antworten
Datensätze ausfiltern ....eigentlich einfach, oder?

Frage
-
Hallo zusammen,
kurz vor den Weihnachtstagen noch ein kleines Problem(chen):
Ich habe hier eine Tabelle mit Einsatzzeiten der Mitarbeiter, und zwar je Arbeitsbeleg und Datum und Mitarbeiter, da gibt es jeweils einen Arbeitscode und natürlich die Stundenzahl (vereinfacht dargestellt).
Jetzt ist es so das beim Arbeitscode TEST dieser erstmal ausgefiltert werden soll (kein Problem :-), aber auch die dazugehörenden ANF und ABF Zeiten unberücksichtigt bleiben sollen --- kurz gesagt: Suche alle Datensätze mit TEST und filtere dann die ANF und ABF Zeilen heraus für denselben Beleg, denselben Tag und denselben Mitarbeiter ,also im unten genannten Beispiel sollen die farbigen Zeilen ausgefiltert werden:
Irgendwie stehe ich hier SQL-technisch auf dem Schlauch und wäre dankbar für einen "Schubser" in die richtige Richtung :-)
Ansonsten erstmal schöne Weihnachtsfeiertage und viele Grüße
Marcus
Antworten
-
Hallo Marcus,
DECLARE @Datentabelle TABLE ( Belegnummer INT, Einsatzdatum DATETIME, Mitarbeiter VARCHAR (MAX), Arbeitstyp VARCHAR (MAX), Stunden INT ); INSERT INTO @datentabelle VALUES ( 4711, '04.12.2019', 'Müller', 'ANF', 1 ), ( 4711, '04.12.2019', 'Müller', 'INST', 5 ), ( 4711, '04.12.2019', 'Müller', 'Pause', 1 ), ( 4711, '04.12.2019', 'Müller', 'ABF', 1 ), ( 4711, '04.12.2019', 'Mustermann', 'ANF', 2 ), ( 4711, '04.12.2019', 'Mustermann', 'Test', 3 ), ( 4711, '04.12.2019', 'Mustermann', 'ABF', 2 ), ( 4712, '07.12.2019', 'Schmidt', 'ANF', 3 ), ( 4712, '07.12.2019', 'Schmidt', 'Demo', 2 ), ( 4712, '07.12.2019', 'Schmidt', 'ABF', 3 ), ( 4713, '12.12.2019', 'Meier', 'Test', 7 ); WITH Gruppe AS ( SELECT Rank() OVER ( ORDER BY Belegnummer, Einsatzdatum, Mitarbeiter) Gruppennummer, * FROM @Datentabelle ) , aussortieren AS ( SELECT Gruppennummer, belegnummer, Einsatzdatum, Mitarbeiter, Arbeitstyp FROM Gruppe WHERE Arbeitstyp = 'Test' ) SELECT g.Belegnummer, g. Einsatzdatum, g.Mitarbeiter, g.Arbeitstyp FROM gruppe g LEFT JOIN aussortieren s ON (g.Belegnummer = s.Belegnummer AND g.Einsatzdatum = S.einsatzdatum AND g.Mitarbeiter = s.Mitarbeiter) WHERE (s.Gruppennummer IS NULL OR g.Gruppennummer = S.Gruppennummer AND g.Arbeitstyp NOT IN ('Test', 'ABF', 'ANF'))
Ich wünsche ebenfalls schöne Weihnachten.
- Bearbeitet Joerg_x Montag, 23. Dezember 2019 23:16
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. Dezember 2019 06:57
- Als Antwort markiert AdminKnecht2011 Montag, 30. Dezember 2019 10:26
Alle Antworten
-
Hallo Marcus,
DECLARE @Datentabelle TABLE ( Belegnummer INT, Einsatzdatum DATETIME, Mitarbeiter VARCHAR (MAX), Arbeitstyp VARCHAR (MAX), Stunden INT ); INSERT INTO @datentabelle VALUES ( 4711, '04.12.2019', 'Müller', 'ANF', 1 ), ( 4711, '04.12.2019', 'Müller', 'INST', 5 ), ( 4711, '04.12.2019', 'Müller', 'Pause', 1 ), ( 4711, '04.12.2019', 'Müller', 'ABF', 1 ), ( 4711, '04.12.2019', 'Mustermann', 'ANF', 2 ), ( 4711, '04.12.2019', 'Mustermann', 'Test', 3 ), ( 4711, '04.12.2019', 'Mustermann', 'ABF', 2 ), ( 4712, '07.12.2019', 'Schmidt', 'ANF', 3 ), ( 4712, '07.12.2019', 'Schmidt', 'Demo', 2 ), ( 4712, '07.12.2019', 'Schmidt', 'ABF', 3 ), ( 4713, '12.12.2019', 'Meier', 'Test', 7 ); WITH Gruppe AS ( SELECT Rank() OVER ( ORDER BY Belegnummer, Einsatzdatum, Mitarbeiter) Gruppennummer, * FROM @Datentabelle ) , aussortieren AS ( SELECT Gruppennummer, belegnummer, Einsatzdatum, Mitarbeiter, Arbeitstyp FROM Gruppe WHERE Arbeitstyp = 'Test' ) SELECT g.Belegnummer, g. Einsatzdatum, g.Mitarbeiter, g.Arbeitstyp FROM gruppe g LEFT JOIN aussortieren s ON (g.Belegnummer = s.Belegnummer AND g.Einsatzdatum = S.einsatzdatum AND g.Mitarbeiter = s.Mitarbeiter) WHERE (s.Gruppennummer IS NULL OR g.Gruppennummer = S.Gruppennummer AND g.Arbeitstyp NOT IN ('Test', 'ABF', 'ANF'))
Ich wünsche ebenfalls schöne Weihnachten.
- Bearbeitet Joerg_x Montag, 23. Dezember 2019 23:16
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 27. Dezember 2019 06:57
- Als Antwort markiert AdminKnecht2011 Montag, 30. Dezember 2019 10:26
-
Hallo Jörg,
prima, vielen Dank, das hat mir sehr geholfen!
Ich konnte zwar die RANK()-Funktion nicht so einsetzen (ergab im VisualStudio immer "falsche SQL-Syntax', bis hin zu Abstürzen im Abfrage-Designer-Fenster, aber im SQL-ManagementStudio-Abfragefenster lief dein Beispiel problemlos durch...), aber ich habe die Anregung aufgenommen und mir einen 'Schlüssel' gebaut aus Belegnummer+Einsatzdatum+Mitarbeiter und letztendlich so dasselbe Ergebnis erhalten wie du!
Toll wie man hier im Forum immer wieder schnelle kompetente Hilfe erhält!
Ansonsten wünsche ich dir schon einmal einen "Guten Rutsch" und bis demnächst!
Marcus