Benutzer mit den meisten Antworten
Datumsabstände bei gruppierten Daten kalkulieren

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.
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- Bearbeitet Christoph Muthmann Donnerstag, 23. August 2012 08:07
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 28. August 2012 07:57
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 20. September 2012 14:11
-
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- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 28. August 2012 07:57
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 20. September 2012 14:11
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.
-
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- Bearbeitet Christoph Muthmann Donnerstag, 23. August 2012 08:07
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 28. August 2012 07:57
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 20. September 2012 14:11
-
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 ?
-
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.
-
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.
-
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- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 28. August 2012 07:57
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 20. September 2012 14:11
-
Hallo Christian Lindemann,
Haben Dir die Antworten geholfen?
Grüße,
RobertRobert 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. -
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,
RobertRobert 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.