Hallo!
ich suche nun schon einige Zeit rum und werde nicht wirklich fündig. Ich habe das Problem dass ich Statistiken über ein Transaction Log machen muss, also hier als minimalbeispiel
Anfragenummer | Kategorie | Person | Zeitstempel |
1 | Auftragserteilung | Herr A | 1.1.2011 |
1 | Authorisierung | Herr B | 2.1.2011 |
1 | Bestellabwicklung | Frau A | 3.1.2011 |
2 | Auftragserteilung | Herr A | 3.1.2011 |
1 | Abschluss | Frau B | 4.1.2011 |
2 | Authorisierung | Frau B | 4.1.2011 |
3 | Nur Anfrage | Frau B | 4.1.2011 |
1 | Rücksendung | Frau B | 4.2.2011 |
Bemerkung: Auch wenn es so aussieht, es ist keine Reihenfolge vorgeschrieben. D.h. Es kann
auch "Nur Anfragen" geben die für sich alleine stehen und keine Bestellabwicklung haben (aber eine andere Anfragenummer haben)..
Nun möchte ich z.B. wissen:
- Wieviele Anfragen (generell) sind von --- bis --- sind eingegangen?
- Wie lange dauerte es zwischen dem ersten Eintrag der Anfrage bis zum letzten Eintrag der Anfrage?
- Wie lange dauerte es zwischen Authorisierung bis zur Bestellabwicklung im Durchschnitt?
Kennt jemand gute Online Ressourcen für derartige Probleme, Bücher? Oder weiss jemand selbst gerade guten Rat?
Mit freundlichen Grüssen
streetfox
Hallo,
das Ganze ist mit normalen Abfragen, bzw. mit den Aggregatfunktionen DCount, DFirst, DLast, Davg zu lösen.
z. B. für den ersten Punkt:
(Abfrage-SQL-String)
Select count (*) from tblTabelle where
(mit Dcount)
Dim Anz as Long, datStartdatum as Date, datEnddatum as Date
datStartdatum =#1/1/2011#
datEnddatum = #1/4/2011#
Anz=DCount("*","tblTabelle" ,"Zeitstempel between " & Format (datStartdatum,"\#yyyy-mm-dd\#") & " and " & Format(datEnddatum ,"\#yyyy-mm-dd\#")
Msgbox Anz
Punkt 2:
Zunächst Abfrage ("abfZeitAsc") erstellen, die nach Zeitstempel aufsteigend sortiert. Diese Abfrage für DFirst und DLast benutzen:
Dim Dauer as Long, lngAbfNr as long
lngAbfNr =1
Dauer = Dlast ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr) - DFirst ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr)
Punkt 3:
Wie oben mit Kombination aus den Dcount, Dfirst und Dlast-Funktionen und mit angepassten/erweiterten Kriterien.
PS: Im Fall, dass die Abfragen/Funktionen keine Datensätze/Werte liefern, sind die Dxxx-Funktionen mit der nz()-FUnktion auf "NULL" zu prüfen:
Dauer = NZ( Dlast ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr) ,0 ) - NZ( DFirst ("Zeitstempel","abfZeitAsc","Abfragenummer= " & lngAbfNr),0 )
Desgleichen muß bei der evtl. vorkommenden Divison durch 0 bei der Durchschnittsberechnung dieser Fall gesondert behandelt werden.
Da hat Dir der Franz bereits die Lösung geliefert.
Du solltest Dich mit SQL beschäftigen und mein erster Tipp hierzu wäre eine URL:
http://www.sql-und-xml.de/sql-tutorial/group-by-zum-aggregieren-auswerten-von-daten.html
Mit Aggregat-Funktionen und GROUP BY Daten auswerten und aggregieren
Als Buch-Tipp:
John-Harry Wieken: SQL - Einstieg für Anspruchsvolle. Inkl. Lösungen und Lerntest, Beispiele, mit CD. Addison-Wesley. ISBN 978-3-8273-2485-6. 29,95 Euro.
Für das iPad:
SQL Reference for iPad.
Schöne App, die direkt (nach Download auch Offline) sowohl den VBA-Befehlssatz für Access 2003 und 2007 als auch eine passende SQL Reference liefert. Dazu DB2, MySQL, Oracle, PostgreSWL, SQL Server und SQLite.
Brauchbar auch die App "iSQL".
Viel Erfolg
Andreas
Hallo
vielen Dank schonmal!
die Datensätze sortieren hatte ich tatsächlich schon gemacht, nur erschien mir meine Lösung (aufgrund fehlender Erfahrung) etwas handbacken, die Frage dazu kommt grad. Freut mich aber, dass man es tatsächlich so in Angriff nehmen muss. Generell etwas SQL kenne ich schon, nur die Problematik mit Zeitstempeln habe ich nirgends gefunden. Das Buch habe ich soeben gekauft ;-)- Die iPad App klingt klasse, besten Dank, werd ich mir auch gerade beschaffen!
Trotzdem noch eine FrageBei Beispiel 1 muss ich ja eine Abfrage erstellen und die danach zählen. Nur: Wie kriege ich eine Abfrage hin die
a) keine Dubletten in der "Anfragenummer" hat (wär ja eig. Distinct) UND
b) jeweils den ersten Eintrag einer "Anfragenummer" bringt?
Zuerst nach Anfragenummer sortieren, dann nach Datum und jeweils den ersten Eintrag nehmen? Da weiss SQL doch nicht welchen Eintrag ich meine, es sei denn ich sage: Nimm immer den frühesten. Wäre das korrekt?
Hierzu auch folgender Eintrag in der MS KB zu DFirst / DLast der mich verunsichert:
Zitat von: http://support.microsoft.com/default.aspx?scid=kb%3Bde%3BD39205Konstruktionsbedingt melden die Funktionen DFirst() (DomErsterWert) und DLast() (DomLetzterWert) den ersten und den letzten Datensatz, den Sie in die zugrundeliegende Tabelle eingegeben haben, und nicht den ersten und letzten Datensatz gemäß Tabellenindex oder der Sortierreihenfolge der Abfrage. Die Funktionen DFirst() und DLast() ignorieren alle Formen von Indizes, auch Primärschlüssel und Sortierreihenfolgen.
In diesem Artikel wird beschrieben, wie Sie benutzerdefinierte Domänenfunktionen schreiben können, die den Funktionen DFirst() und DLast() ähneln. Die benutzerdefinierten Domänenfunktionen DStart() und DEnd() aus diesem Artikel melden den ersten und den letzten Datensatz gemäß der Auflistung in einer sortierten Abfrage.
Vielen Dank für Eure Hilfe
Hallo,
in der Tat machen Dfirst und DLast nicht das, was man erwartet...
Hier zwei Ersatzfunktionen:
Public Function DStart(ColName As String, Tablename As String, krit As String, Sortfield As String)
Dim rs As DAO.Recordset
On Error GoTo DStart_Error
If Len(ColName) = 0 Then Exit Function
If Len(Tablename) = 0 Then Exit Function
If Len(Sortfield) = 0 Then Exit Function
If Len(krit) = 0 Then
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "]", dbOpenSnapshot)
Debug.Print ("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "]")
Else
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] where " & krit & " order by [" & Sortfield & "]", dbOpenSnapshot)
End If
If rs.RecordCount > 0 Then
rs.MoveFirst
DStart = rs(0)
End If
rs.Close: Set rs = Nothing
exit_Function:
Exit Function
DStart_Error:
MsgBox Err.Number & " " & Err.Description
Resume exit_Function
End Function
Public Function DEnd(ColName As String, Tablename As String, krit As String, Sortfield As String)
Dim rs As DAO.Recordset
On Error GoTo DEnd_Error
If Len(ColName) = 0 Then Exit Function
If Len(Tablename) = 0 Then Exit Function
If Len(Sortfield) = 0 Then Exit Function
If Len(krit) = 0 Then
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "] desc", dbOpenSnapshot)
Debug.Print ("select [" & ColName & "] from [" & Tablename & "] order by [" & Sortfield & "]")
Else
Set rs = CurrentDb.OpenRecordset("select [" & ColName & "] from [" & Tablename & "] where " & krit & " order by [" & Sortfield & "] desc", dbOpenSnapshot)
End If
If rs.RecordCount > 0 Then
rs.MoveFirst
DEnd = rs(0)
End If
rs.Close
Set rs = Nothing
exit_Function:
Exit Function
DEnd_Error:
MsgBox Err.Number & " " & Err.Description
Resume exit_Function
End Function
Die "Dupletten" sind keine solchen, weil die Abfragenummer als Kriterium auftaucht, d. h. auftauchen muß.
Danke, ich tu mir das mal an ;-)
Aus Eurer Erfahrung raus, lohnt es sich die normalisierten Daten zu rekonstruieren und in Tabellen zwischenzuspeichern?
Tabelle 1 (Anfragen) [Mit DISTINCT rekonstruieren)
Anfragenr | Weitere |
1 | ... |
2 | ... |
3 | ... |
Tabelle 2 (Ereignisse)
Zeitstempel | Kategorie | Anfragenr | Person |
1.1.2011 | Auftragserteilung | 1 | Herr A |
2.1.2011 | Authorisierung | 1 | Herr B |
3.1.2011 | Bestellabwicklung | 1 | Frau A |
3.1.2011 | Auftragserteilung | 2 | Herr A |
Zur Laufzeit der DB reicht es vielleicht mit "Disconnected Recordsets" zu arbeiten. Dann brauchst Du keine Tabellen. Ansonsten, ich trau mich hier fast nicht es zu sagen, meine geliebten Arrays eignen sich auch wunderbar zum arbeiten, anstelle temporärer Tabellen.
Viele Grüße
Andreas
Hallo,
ich denke, hier steht (ausnahmsweise ;D ) mal nicht die Normalisierung im Vordergrund, die sich eh nur auf die "Kategorie" und die "Person" auswirkte. (Ich denke mal, die Anfragenummer ist eh schon in einer weiteren Tabelle näher definiert).
Der Lösungsweg liegt darin, nach der Abfragenummer (und ggfls. nach einem Zeitbereich) zu filtern und nach dem Zeitstempel zu sortieren, um eben Anfangswert und Endwert zu erhalten und die Berechnungen unter Verwendung der gelieferten Werte der besagten Funktionen durchzuführen.
nuja, wahrscheinlich ist die Anfragenummer in einer anderen Tabelle. Nur ist der Datensatz (wie im Minimalbeispiel) das einzige was mir zur Verfügung steht :-\