none
Datensätze ausfiltern ....eigentlich einfach, oder? RRS feed

  • 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

    Montag, 23. Dezember 2019 14:10

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.

    Montag, 23. Dezember 2019 22:42

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.

    Montag, 23. Dezember 2019 22:42
  • 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

    Montag, 30. Dezember 2019 10:26