none
Datumsabstände bei gruppierten Daten kalkulieren RRS feed

  • Frage

  • Hallo zusammen,

    ich bin relativ neu hinsichtlich der SQL-Programmierung.

    Ich wurde beauftragt Optimierungspotenziale innerhalb der Lieferkette des Unternehmens zu finden.

    Eines dieser Optimierungspotenziale ist die Reduzierung von Abholungen indem von ein und demselben Lieferanten innerhalb von 10 Tagen nur einmal abgeholt werden wenn die Abholdaten der Order in diesem Zeitraum fallen

    Im Grunde genommen sollte das Tabellenergebnis so aussehen.

    Ordernummer  Abholdatum   Abstand zum vorherigen/bzw. frühestem Datum Gruppieren ja/nein

    1                     01.02.2012  0                                                                         ja   

    2                     04.02.2012  3                                                                         ja    

    3                     07.02.2012  6                                                                         ja       

    4                     14.02.2012  13                                                                      

    Meine Sql-Statements Versuche über grouping, min(), between waren leider von keinem Erfolg gekrönt.

    Mittwoch, 22. August 2012 21:55

Antworten

  • Hallo!

    Ein Realname, zumindest ein Vorname macht die Kommunikation angenehmer. Hier mal etwas Code zur Diskussion, wobei der Hinweis von Olaf absolut berechtigt ist!

    Declare @Tab_A as Table (Ordernummer int, Abholdatum date    );
    Insert into @Tab_A(Ordernummer, Abholdatum) values(1, '2012-02-01');
    Insert into @Tab_A(Ordernummer, Abholdatum) values(2, '2012-02-04');
    Insert into @Tab_A(Ordernummer, Abholdatum) values(3, '2012-02-07');
    Insert into @Tab_A(Ordernummer, Abholdatum) values(4, '2012-02-14');
     With CTE as
    (
    Select Ordernummer, Abholdatum, ROW_NUMBER() OVER(ORDER BY Abholdatum) as
    rrn
    from @Tab_A
    ),
    Anfang as
    (
    Select min(Abholdatum) as Anfangsdatum
    from @Tab_A
    )
    Select c1.Ordernummer, c1.Abholdatum, c2.Ordernummer, c2.Abholdatum,
    datediff(Day, c2.Abholdatum, c1.Abholdatum) as Differenz, datediff(Day,
    Anfang.Anfangsdatum, c1.Abholdatum) as Diff_Anfang,
    case when datediff(Day, Anfang.Anfangsdatum, c1.Abholdatum) < 10 then 'Ja'
    else 'Nein' end as Gruppieren
    from CTE as c1
    left Join CTE as c2
    on c1.rrn= c2.rrn+1,
    Anfang;

    Müsste die Fragestellung, nicht eher heißen, wie viele Abholungen fanden innerhalb ersten 10, 20, 30 Tage in einem Monat statt? Dann könnte man sehen, wie viele Abholungen man zusammenfassen könnte. Das könnte man so ungefähr lösen:

    With CTE as
    (
    Select Abholdatum, case when datediff(Day, '2012-02-01', Abholdatum) < 10
    then 1 else 0 end as Z1,
    case when datediff(Day, '2012-02-01', Abholdatum) between 10 and 19 then 1
    else 0 end as Z2,
    case when datediff(Day, '2012-02-01', Abholdatum) >= 20 then 1 else 0 end as
    Z3
    from @Tab_A
    )
    Select Month(Abholdatum) as Monat, sum(Z1) as Anz_Z1, sum(Z2) as Anz_Z2,
    sum(Z3) as Anz_Z3
    from CTE
    group by Month(Abholdatum)
    ;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu


    Donnerstag, 23. August 2012 08:05
  • Hallo Christian,
    könntest Du nicht wenigstens (wie in meiner Antwort) eine Tabellenvariable mit den richtigen Datentypen erzeugen und ein paar Beispieldaten einfügen, damit wir alle über das selbe reden! ? !

    Von den Datentypen hängt nun teilweise leider auch immer mal die Syntax ab, und die Beispieldaten verdeutlichen uns, mit welcher Problematik Du gerade kämpfst.

    Weiterhin wäre es wichtig die Version des SQL Servers zu erfahren, da sich hier in der Syntax einiges verändert hat.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 24. August 2012 06:17

Alle Antworten

  • Im Grunde genommen sollte das Tabellenergebnis so aussehen.

    Hallo,

    neben dem gewünschtem Ergebnis wäre jetzt noch das Design der Basistabelle mit ein paar Beispielwerten ( = CREATE + paar INSERT Statements) wichtig; sonst kann Dir niemand sagen, wie Du von dort zum gewünschten Ergebnis kommen kannst.


    Olaf Helper
    Blog Xing

    Donnerstag, 23. August 2012 05:00
  • Hallo!

    Ein Realname, zumindest ein Vorname macht die Kommunikation angenehmer. Hier mal etwas Code zur Diskussion, wobei der Hinweis von Olaf absolut berechtigt ist!

    Declare @Tab_A as Table (Ordernummer int, Abholdatum date    );
    Insert into @Tab_A(Ordernummer, Abholdatum) values(1, '2012-02-01');
    Insert into @Tab_A(Ordernummer, Abholdatum) values(2, '2012-02-04');
    Insert into @Tab_A(Ordernummer, Abholdatum) values(3, '2012-02-07');
    Insert into @Tab_A(Ordernummer, Abholdatum) values(4, '2012-02-14');
     With CTE as
    (
    Select Ordernummer, Abholdatum, ROW_NUMBER() OVER(ORDER BY Abholdatum) as
    rrn
    from @Tab_A
    ),
    Anfang as
    (
    Select min(Abholdatum) as Anfangsdatum
    from @Tab_A
    )
    Select c1.Ordernummer, c1.Abholdatum, c2.Ordernummer, c2.Abholdatum,
    datediff(Day, c2.Abholdatum, c1.Abholdatum) as Differenz, datediff(Day,
    Anfang.Anfangsdatum, c1.Abholdatum) as Diff_Anfang,
    case when datediff(Day, Anfang.Anfangsdatum, c1.Abholdatum) < 10 then 'Ja'
    else 'Nein' end as Gruppieren
    from CTE as c1
    left Join CTE as c2
    on c1.rrn= c2.rrn+1,
    Anfang;

    Müsste die Fragestellung, nicht eher heißen, wie viele Abholungen fanden innerhalb ersten 10, 20, 30 Tage in einem Monat statt? Dann könnte man sehen, wie viele Abholungen man zusammenfassen könnte. Das könnte man so ungefähr lösen:

    With CTE as
    (
    Select Abholdatum, case when datediff(Day, '2012-02-01', Abholdatum) < 10
    then 1 else 0 end as Z1,
    case when datediff(Day, '2012-02-01', Abholdatum) between 10 and 19 then 1
    else 0 end as Z2,
    case when datediff(Day, '2012-02-01', Abholdatum) >= 20 then 1 else 0 end as
    Z3
    from @Tab_A
    )
    Select Month(Abholdatum) as Monat, sum(Z1) as Anz_Z1, sum(Z2) as Anz_Z2,
    sum(Z3) as Anz_Z3
    from CTE
    group by Month(Abholdatum)
    ;

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu


    Donnerstag, 23. August 2012 08:05
  • Hi Olaf,

    ich kann dir leider diesbezüglich keine weiteren Beispielwerte nennen, da ich auf hinsichtlich der SQL-Befehle nur den "Select" Befehl benutzen darf. Alle anderen Befehle darf ich nicht nutzen, da ich keinen vollen Zugriff auf die SQL-Server habe :(. Ich habe ebenfalls nur Zugriff auf eine vordefinierte Anzahl an Tabellen und kann selber keine neue erstelllen, löschen, manipulieren. Diese Basistabellen sind Ergebnisse eines EDI-Feeds der sich stündlich ändert und dementsprechend auch die Datenmenge.

    Du musst dir das ungefähr so vorstellen, dass ich meine Select Statements in einem Eingabefenster eingebe und daraus im Folgeschritt Reports erstellt werden.

    Ich hoffe ich konnte dir hiermit die Problematik vor der ich stehe näher erläutern.

    Inwiefern können mir Subqueries diesbezüglich helfen um diese Kalkulation durchzuführen ?

    Donnerstag, 23. August 2012 12:22
  • ich kann dir leider diesbezüglich keine weiteren Beispielwerte nennen, da ich auf hinsichtlich der SQL-Befehle nur den "Select" Befehl benutzen darf.

    Hallo Christian,

    das SELECT reicht doch. Es geht darum zu wissen, welche Felder (mit Datentypen) es in der Tabelle gibt und welche Werte enthalten sind.


    Olaf Helper
    Blog Xing

    Donnerstag, 23. August 2012 14:36
  • H Olaf,

    danke dir soweit. Anbei das Select Statement mit dem ich angefangen habe. Relativ einfach soweit. Frage ist nun wie ich die Datumsabstände messe, muss das in einer Subquery getan werden?

    SELECT Distinct

    -- PO Order Information
    Lieferant as 'Vendor Name', (Textfeld)
    count(Lieferant)  as 'countVendor Name', (Textfeld)
    Abholdatum as 'Start Ship Date',(Datumsfeld)
    Ordernummer, (Zahlenfeld,int)
    count(Abholdatum) AS 'countStart Ship Date' (Datumsfeld)

    FROM

    table_Ordernummer

    Group by Lieferant,Abholdatum,Ordernummer

    Danke vorab für die Hilfe.

    Donnerstag, 23. August 2012 14:54
  • Hallo Christian,
    könntest Du nicht wenigstens (wie in meiner Antwort) eine Tabellenvariable mit den richtigen Datentypen erzeugen und ein paar Beispieldaten einfügen, damit wir alle über das selbe reden! ? !

    Von den Datentypen hängt nun teilweise leider auch immer mal die Syntax ab, und die Beispieldaten verdeutlichen uns, mit welcher Problematik Du gerade kämpfst.

    Weiterhin wäre es wichtig die Version des SQL Servers zu erfahren, da sich hier in der Syntax einiges verändert hat.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 24. August 2012 06:17
  • Hallo Christian Lindemann,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 20. September 2012 14:11
    Moderator