Problem mit Durchschnittsberechnung

darti

Benutzer
Beiträge
11
Hallo allerseits,

ich versuche gerade Abfragen für eine OTRS Datenbank zu erstellen und stehe vor einem Problem. Es soll die durchschnittliche Bearbeitungsdauer für Tickets erstellt werden. Die Abfrage sieht im Kern so aus:

Code:
SELECT SUM( time_accounting.time_unit ) / COUNT(ticket.id)
FROM time_accounting
INNER JOIN ticket ON ticket.id = time_accounting.ticket_id
WHERE ticket.queue_id IN ( 43 )

Dabei kommt aber nicht das gewünschte Ergebnis heraus. Die Tickets (ticket.id) bestehen meist aus mehreren Nachrichten (time_accounting.message_id), die immer eine Bearbeitungszeit haben. Bei dieser Abfrage wird nun die Zeitsumme durch die Anzahl der einzelnen Nachrichten und nicht durch die Anzahl der Tickets geteilt.

wie kann ich erreichen, dass durch die Ticketanzahl dividiert wird?

Gruß
Rainer
 
Werbung:
In wie fern? In der ersten Zeile steht eigentlich was ich will "/ COUNT(ticket.id)", aber berechnet wird "/ COUNT(time_accounting.message_id)". Das ist mir auch nur zufällig aufgefallen, weil ich mal die Ergebnisse mit den Reports, die man mit OTRS erstellt, verglichen habe. Das Ergebnis ist das gleiche wie "AVG(time_accounting.time_unit)".
 
Irgendwie stehe ich etwas auf dem Schlauch.:confused: Was ich haben will steht eigentlich in der Abfrage drin, bringt aber nicht das gewünschte Ergebnis. Es ist egal ob ich nun "/ COUNT(ticket.id)" oder "/ COUNT(time_accounting.message_id)" in der SELECT Anweisung nutze, denn es kommt das gleiche Ergebnis heraus. Da liegt wohl daran, dass durch das INNER JOIN eigentlich
time_accounting.ticket_id gezählt wird und nicht ticket.id und da kommen viele Ticket mehrfach in der Tabelle time_accounting vor. Wahrscheinlich liegt da bei mir ein Denk-/Verständnisfehler vor, aber ich bin auch noch Anfänger. Eine angedachte Umstellung kann ich aber aus meinen vorherigen Post nicht erkennen. ;)

P.S. Es heißt eigentlich article_id und nicht message_id. Ich hatte das falsch in Erinnierung ist aber für das Verständnis nicht wichtig.
 
Code:
SELECT SUM( time_accounting.time_unit ) / COUNT(DISTINCT ticket.id)
FROM time_accounting
INNER JOIN ticket ON ticket.id = time_accounting.ticket_id
WHERE ticket.queue_id IN ( 43 )
Wäre wohl der einfachste Weg... Ich hab aber keine Ahnung ob MySQL den "Count(distinct ...)"-Befehl kann... :)
 
Auf die Idee bin ich auch schon gekommen. Das Ergebnis war aber sehr komisch und dann habe ich auch gelesen warum. "Count(distinct ...)" sucht nur die Tickets heraus, die einmalig vorkommen. Alle Tickets die mehrere Nachrichten haben und damit mehrfach in time_accounting vorkommen, fallen dabei heraus. Das hilft mir auch nicht weiter.
 
Das will ich auch haben, aber das kommt nicht heraus. Ich verdeutliche das mal an einem Beispiel:

Ticket 1 -> 1 Nachrichten
Ticket 2 -> 4 Nachrichten
Ticket 3 -> 1 Nachrichten
Ticket 4 -> 2 Nachrichten

Ich möchte in diesem Falle, dass die Zeitsumme durch 4 geteilt wird, weil ich 4 Tickets habe. In meiner Abfrage wird aber durch 8 geteilt, weil die Anzahl der Nachrichten genommen wird, obwohl "COUNT(ticket.id)" für sich genommen 4 ergeben würde. Da funkt dann der INNER JOIN irgendwie rein. Bei "Count(distinct ...)" wird aber nur durch 2 geteilt. Das liegt daran, dass "Count(distinct ...)" nur einzigartige Tickets nimmt und das sind Nr. 1 und 3 weil sie nur eine Nachricht haben. Für jede Nachricht wird in der Tabelle time_accounting eine Zeile erstellt und dadurch kommt die selbe Ticket ID mehrfach in der Tabelle vor, wenn es mehrere Nachrichten besitzt. Damit ist es für DISTINCT nicht mehr einzigartig.
 
DISTINCT (soll) jede vorkommende ticket.id einmal zählen, nicht nur ids, die einmal vorkommen. Das wäre eher mit HAVING count(id) = 1 zu lösen.
 
Werbung:
Hallo allerseits,

ich habe gerade heraus gefunden, dass ich mich etwas verlesen habe und "COUNT(Distinct...)" falsch interpretiert habe. Das Problem war, dass eine reines "SUM (ticket.id)" ohne JOIN deutlich höhere Werte ergeben hat als "COUNT(DISTINCT ticket.id)" mit dem JOIN auf "time_accounting". Ich habe gerade herausgefunden warum das so ist. In der Tabelle "ticket" sind noch die gemergten Tickets vorhanden, in "time_accounting" aber nicht mehr. Danke nochmal für die Hilfe.

Gruß
Rainer
 
Zurück
Oben