none
Zeilenabhängigkeit RRS feed

  • Frage

  • Hallo,
    folgendes Problem gibt es für mich zu lösen:
    Für jedes Datum gibt es viele Zeilen. Dabei interessieren mich nur Zeilen mit einem gewissen Kriterium, sagen wir Grund = 1. Die Abfrage würde also lauten:

    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    from		Datenbanktabelle
    where		Grund = '1'

    Bis jetzt alles kein Problem.
    Die Frage ist jetzt, wie ich es umsetzen kann, Abhängigkeiten zwischen den Zeilen zu erreichen. Es interessieren nämlich nur die Zeilen für

    DATEPART(WEEKDAY,Datum) = 2 
    und
    DATEPART(WEEKDAY,Datum) = 5
    unter der Zusatzbedingung, dass es gar keine Zeilen für die selbe "Nummer" in der selben Kalenderwoche an anderen Wochentagen gibt.
    Keine Ahnung, wie ich das lösen könnte.
    Danke für die Hilfe!


    Donnerstag, 14. November 2019 06:15

Antworten

  • Danke für den Hinweis, dann muss man das noch aufnehmen.

    use tempdb
    go
    
    Create Table #Datenbanktabelle(Datum date, Nummer int, Grund varchar(20), Teil varchar(70));
    
    Insert into #Datenbanktabelle(Datum, Nummer, Grund, Teil) values 
    ('2019-01-01', 100, '1', 'Teil 0'),
    ('2019-01-02', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-01-03', 100, '1', 'Teil 2'),
    ('2019-11-10', 100, '1', 'Teil 0'),
    ('2019-11-11', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-11-12', 100, '1', 'Teil 2'),
    ('2019-11-13', 100, '1', 'Teil 3'),
    ('2019-11-14', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-11-15', 100, '1', 'Teil 5'),
    ('2019-11-16', 100, '1', 'Teil 6'),
    ('2019-11-18', 100, '1', 'Es gibt keine anderen in der KW außer am Wochentag 2 und 5'),
    ('2019-11-21', 100, '1', 'Es gibt keine anderen in der KW außer am Wochentag 2 und 5'),
    ('2019-12-30', 100, '1', 'Es gibt keine anderen in der KW + Jahr an anderen Wochentagen')
    ;
    
    
    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    		, DATEPART(WEEKDAY, Datum) as Wochentag
    		, DATEPART(ISO_WEEK, Datum) as Iso_Week
    		, YEAR(DATEADD(day, 26 - DATEPART(ISO_WEEK, Datum), Datum)) as Iso_Year
    from		#Datenbanktabelle
    where		Grund = '1';
    
    With Vorberechnung as 
    (
    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    		, DATEPART(WEEKDAY, Datum) as Wochentag
    		, DATEPART(ISO_WEEK, Datum) as Iso_Week
    		, YEAR(DATEADD(day, 26 - DATEPART(ISO_WEEK, Datum), Datum)) as Iso_Year
    from		#Datenbanktabelle D
    where		Grund = '1'
    )
    Select *
    from Vorberechnung D
    where DATEPART(WEEKDAY, Datum) in (2, 5) 
    and not exists(
    			Select * from  Vorberechnung D2 
    			where D.Nummer = D2.Nummer 
    			and D2.Wochentag not in (2, 5) 
    			and D2.Iso_Week = D.Iso_Week
    			and D2.Iso_Year = D.Iso_Year
    			);
    
    
    
    go
    Drop Table #Datenbanktabelle;
    Siehe auch: Year of an ISO week


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    • Als Antwort markiert Olaf113 Montag, 18. November 2019 06:46
    Freitag, 15. November 2019 07:14
    Beantworter

Alle Antworten

  • Hallo Olaf,

    der Beschreibung alleine nach kann ich nicht so ganz rausfinden, was die Ausgangssituation und das gewünschte Ergebnis ist. Bitte poste das Tabellen Design als DDL, ein paar Beispieldaten als DML SQL Skript und das gewünschte Ergebnis.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 14. November 2019 07:26
  • Hallo Olaf113,

    vielleicht habe ich ja verstanden, was Du willst!

    use tempdb
    go
    
    Create Table #Datenbanktabelle(Datum date, Nummer int, Grund varchar(20), Teil varchar(60));
    
    Insert into #Datenbanktabelle(Datum, Nummer, Grund, Teil) values 
    ('2019-11-10', 100, '1', 'Teil 0'),
    ('2019-11-11', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-11-12', 100, '1', 'Teil 2'),
    ('2019-11-13', 100, '1', 'Teil 3'),
    ('2019-11-14', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-11-15', 100, '1', 'Teil 5'),
    ('2019-11-16', 100, '1', 'Teil 6'),
    ('2019-11-18', 100, '1', 'Es gibt keine anderen in der KW außer am Wochentag 2 und 5'),
    ('2019-11-21', 100, '1', 'Es gibt keine anderen in der KW außer am Wochentag 2 und 5');
    
    
    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    		, DATEPART(WEEKDAY, Datum) as Wochentag
    		, DATEPART(ISO_WEEK, Datum) as Iso_Week
    from		#Datenbanktabelle
    where		Grund = '1';
    
    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    		, DATEPART(WEEKDAY, Datum) as Wochentag
    		, DATEPART(ISO_WEEK, Datum) as Iso_Week
    from		#Datenbanktabelle D
    where		Grund = '1'
    and DATEPART(WEEKDAY, Datum) in (2, 5) 
    and not exists(Select * from  #Datenbanktabelle D2 where D.Nummer = D2.Nummer and DATEPART(WEEKDAY, D2.Datum) not in (2, 5) and DATEPART(ISO_WEEK, D2.Datum) = DATEPART(ISO_WEEK, D.Datum));
    
    
    
    go
    Drop Table #Datenbanktabelle;


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Donnerstag, 14. November 2019 08:32
    Beantworter
  • Das funktioniert leider nicht, wenn sich die Wochen in 2 unterschiedlichen Jahren bewegen, da ISO_WEEK leider das Jahr außen vor lässt.
    Donnerstag, 14. November 2019 15:51
  • Danke für den Hinweis, dann muss man das noch aufnehmen.

    use tempdb
    go
    
    Create Table #Datenbanktabelle(Datum date, Nummer int, Grund varchar(20), Teil varchar(70));
    
    Insert into #Datenbanktabelle(Datum, Nummer, Grund, Teil) values 
    ('2019-01-01', 100, '1', 'Teil 0'),
    ('2019-01-02', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-01-03', 100, '1', 'Teil 2'),
    ('2019-11-10', 100, '1', 'Teil 0'),
    ('2019-11-11', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-11-12', 100, '1', 'Teil 2'),
    ('2019-11-13', 100, '1', 'Teil 3'),
    ('2019-11-14', 100, '1', 'Es gibt noch andere in der KW an anderen Wochentagen'),
    ('2019-11-15', 100, '1', 'Teil 5'),
    ('2019-11-16', 100, '1', 'Teil 6'),
    ('2019-11-18', 100, '1', 'Es gibt keine anderen in der KW außer am Wochentag 2 und 5'),
    ('2019-11-21', 100, '1', 'Es gibt keine anderen in der KW außer am Wochentag 2 und 5'),
    ('2019-12-30', 100, '1', 'Es gibt keine anderen in der KW + Jahr an anderen Wochentagen')
    ;
    
    
    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    		, DATEPART(WEEKDAY, Datum) as Wochentag
    		, DATEPART(ISO_WEEK, Datum) as Iso_Week
    		, YEAR(DATEADD(day, 26 - DATEPART(ISO_WEEK, Datum), Datum)) as Iso_Year
    from		#Datenbanktabelle
    where		Grund = '1';
    
    With Vorberechnung as 
    (
    select		Datum
    		,Nummer	
    		,Grund
    		,Teil
    		, DATEPART(WEEKDAY, Datum) as Wochentag
    		, DATEPART(ISO_WEEK, Datum) as Iso_Week
    		, YEAR(DATEADD(day, 26 - DATEPART(ISO_WEEK, Datum), Datum)) as Iso_Year
    from		#Datenbanktabelle D
    where		Grund = '1'
    )
    Select *
    from Vorberechnung D
    where DATEPART(WEEKDAY, Datum) in (2, 5) 
    and not exists(
    			Select * from  Vorberechnung D2 
    			where D.Nummer = D2.Nummer 
    			and D2.Wochentag not in (2, 5) 
    			and D2.Iso_Week = D.Iso_Week
    			and D2.Iso_Year = D.Iso_Year
    			);
    
    
    
    go
    Drop Table #Datenbanktabelle;
    Siehe auch: Year of an ISO week


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    • Als Antwort markiert Olaf113 Montag, 18. November 2019 06:46
    Freitag, 15. November 2019 07:14
    Beantworter
  • Hallo zusammen, hallo Christoph,
    D A N K E!!!!
    Das ist die exakte Lösung für das Problem. Hab es eben durchgetestet. PERFEKT!
    Dieses Forum ist echt der Hit!
    VG
    Olaf

    Montag, 18. November 2019 06:46