Grüß euch.
Da ich erst seit einigen Wochen mit Access arbeite steh ich grad vor nem kleinen Problem bei dem ihr mir sicherlich helfen könnt ;D
Folgende Daten sind vorhanden:
Tabelle:
entry No____Repair order No_____old Status___new Status___Creation Date
123________110123____________0__________1_________ ___04.07.2011
147________110123____________1__________4_________ ___05.07.2011
155________110123____________4__________5_________ ___19.07.2011
157________110156____________0__________1_________ ___04.07.2011
169________110156____________1__________4_________ ___08.07.2011
175________110156____________4__________1_________ ___23.07.2011
199________110156____________1__________7_________ ___24.07.2011
usw.
Was ich nun Brauche ist eine Berechung wie lange, also wie viele Tage die jeweilige Repair order No_ auf Status 1, 2 ,3 usw. war.
Wie man sieht kann ein Status öfters vorkommen, dieser müsste dann zusammengerechnet werden.
Ich hatte mal eine Lösung, wo ich die Tabelle auf sich selbst verlinkt hab, was aber zu fehlerhaften Ergebnissen durch doppeleinträge gezeichnet war.
Vermutlich ist das total einfach aber als Anfänger seh ich den Wald vor lauter Bäumen nicht ;D
Danke euch schon mal im vorraus
Hallo Smartengine,
Versuch's Mal damit
SELECT DeineTabelle.ID, DeineTabelle.DeinDatum, _
(SELECT MIN(T.DeinDatum)
FROM DeineTabelle T WHERE DeinDatum > DeineTabelle.DeinDatum) AS
NächstesDatum, DateDiff("D",DeineTabelle.DeinDatum, (SELECT MIN(T.DeinDatum)
FROM DeineTabelle T WHERE DeinDatum > DeineTabelle.DeinDatum)) AS Differenz
FROM DeineTabelle
WHERE (SELECT MIN(T.DeinDatum) FROM DeineTabelle T WHERE DeinDatum >
DeineTabelle.DeinDatum) Is Not Null
Sorry, war noch gar nicht fertig. Wollte es eigentlich besser formatieren und den Quellennachweis dazu schreiben.
Also
SELECT DeineTabelle.ID,
DeineTabelle.DeinDatum, _
(SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE DeinDatum > DeineTabelle.DeinDatum) AS NächstesDatum, _
DateDiff("D",DeineTabelle.DeinDatum, (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE _
DeinDatum>DeineTabelle.DeinDatum)) AS Differenz
FROM DeineTabelle
WHERE (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE DeinDatum > DeineTabelle.DeinDatum) Is Not Null
(Henry Habermacher)
Tabellen- und Feldnamen musst Du natürlich anpassen.
hth
gruss ekkehard
Hallo Smartengine,
Ich noch Mal. Gerade noch Mal genau die Frage gelesen (Franz und Peter mögen mir meinen erneuten Schnellschuss vergeben).
Da fehlt natürlich noch der Filter auf die Repair_Order_No
SELECT DeineTabelle.Entry_No,
DeineTabelle.Repair_Order_No, ...
.
... WHERE (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE DeinDatum > DeineTabelle.DeinDatum) Is Not Null AND _
DeineTabelle.Repair_Order_No = Bla
Geht so aber trotzdem nicht, da Du ja zwei Statusfelder hast.
Das würde ich ändern, da Du doch nur den aktuellen Status brauchst; will sagen, wenn sich der Status ändert, schreibst Du einen neuen DS mit dem neuen.
Also
entry No____Repair order No_____Status___Creation Date
123________110123____________1_______04.07.2011
147________110123____________4_______05.07.2011
155________110123____________5_______19.07.2011
So sollte es dann funktionieren.
gruss ekkehard
Guten Morgen Ekkehard.
Das mit dem 2. Status weglassen ist kein Problem.
Werde es dann sobald ich Zeit habe Testen. Heute is nur irgendwie Meeting-Day bei mir^^
Danke dir.
Hallo,
ZitatIch hatte mal eine Lösung, wo ich die Tabelle auf sich selbst verlinkt hab, was aber zu fehlerhaften Ergebnissen durch doppeleinträge gezeichnet war
Hierzu musst du in deine Tabelle ein Feld mit (als Autowert z.B. TabID) als Primärschlüssel einfügen, da der Join auf sich selbst in dem Fall eine fortlaufende Nummer benötigt
Danach kannst du die Tagesdifferenzen wie folgt berechnen lassen - Mit dem erwähnten Join auf sich selbst
SELECT T1.[entry No], T1.[Repair Order No], T1.[old Status], T1.[new Status], T2.[Creation Date] AS CD2, T1.[Creation Date] AS CD1, CD1-CD2 AS Differenz
FROM DeineTabelle AS T1
LEFT JOIN DeineTabelle AS T2
ON T1.TabID = T2.TabID + 1
WHERE T1.[old Status] > 0
SELECT T.entryNo ,
T.RepairOrderNo,
T.oldStatus ,
T.newStatus ,
T.CreationDate ,
T.CreationDate - NZ(SELECT MAX(X.CreationDate)
FROM DeineTabelle X
WHERE X.CreationDate < T.CreationDate
AND X.RepairOrderNo = T.RepairOrderNo
), T.CreationDate) AS Diff
FROM DeineTabelle T
MfGA
ebs
Hallo,
Zitat...Wie man sieht kann ein Status öfters vorkommen, dieser müsste dann zusammengerechnet werden...
Die Summen von identen Statuseinträgen berechnest du dann über eine neue Abfrage.
In der Annahme, dass du meinem Tipp in #5 für die Ermittlung der Standzeiten gefolgt bist und die Abfrage unter dem Namen 'qryDifferenzen' abgespeichert hast
erzeugst du eine neue Abfrage und fügst in der SQL Ansicht dieser neuen Abfrage die folgende SQL ein:
SELECT qryDifferenzen.[Repair Order No], qryDifferenzen.[old Status], Sum(qryDifferenzen.[Differenz]) AS Statussumme
FROM qryDifferenzen
GROUP BY qryDifferenzen.[Repair Order No], qryDifferenzen.[old Status]