Dauer berechnen und Gruppieren (Durchschnitt)

JesusFreak777

Erfahrenes Mitglied
Hallo,

ich habe eine Tabelle in der start_zeit und stop_zeit gegeben ist daraus errechne ich mir die Dauer

etwa so:
Code:
SELECT count(*), bezeichnung,
CASE
   WHEN stop_zeit IS NOT NULL THEN
      ROUND( (stop_zeit - start_zeit) * 24 * 60 * 60 )
   ELSE ROUND( (SYSDATE - start_zeit) * 24 * 60 * 60 )
END dauer -- in Sekunden
FROM tabelle
WHERE trunc(start_zeit) = to_date('09.07.2015')

Soweit so gut...

wie kann ich jetzt die Dauer Gruppieren und durch die Anzahl Teilen (sozusagen einen durchschnitt errechnen)

meine idee war drunter ein GROUP BY ( dauer / count(*) ) zu schreiben... aber das funktioniert nicht...

Ich arbeite mit dem SQL-Developer auf Oracle 11a

Vielen Dank für jede Hilfe

Gruß
 
Dein SQL sollte eigentlich einen Fehler werfen.
Der Count und die Berechnung ohne Aggregationsfunktion (count, sum, min etc) ist falsch. Auch der GROUP BY fehlt.

Zu deiner Frage. Eines nach dem Anderen. Das ist die Antwort. Zuerst die Dauer berechnen. Dann erst gruppieren.

SQL:
SELECT calc.dauer / count(calc.*) AS durchschnitt
FROM
    (
        SELECT ROUND(NVL(tbl.stop_zeit, SYSDATE) - tbl.start_zeit) * 24 * 60 * 60 AS dauer
        FROM tabelle tbl
    ) calc
GROUP BY calc.dauer
 
Hi,

stimmt, da habe ich beim Kopieren irgendwie zwei versionen vermischt :/ ...

SQL:
SELECT calc.DauerSekunden / COUNT(calc.*) AS durchschnitt
FROM
  (
  SELECT ROUND((NVL(tbl.stop_zeit, SYSDATE) - tbl.start_zeit) * 24 * 60 * 60) AS dauer
  FROM db_sys.tabelle tbl
  WHERE trunc(tbl.start_zeit) = to_date('09.07.2015')
  AND tbl.bezeichnung LIKE ( 'JOB_FILTER' )
  ) calc
GROUP BY calc.DauerSekunden;
 
--wie kann ich eigentlich hier den code als SQL anzeigen? EDIT: Habs herausgefunden :)

hier wirft er leider den Fehler:
ORA-01747: Ungültige Angabe für benutzer.tabelle.spalte, tabelle.spalte oder spalte
01747. 00000 - "invalid user.table.column, table.column, or column specification"
=> mit einem verweis auf calc.*

Wenn ich den reinen SELECT ausprobiere wirft er wie erwartet meine z.B. 12 Zeiten aus!
 
Im inneren Select heisst dein Feld dauer. Im äusseren auf einmal DauerSekunden

Beim COUNT kannst du das calc. auch weglassen
 
Oh ...

jetzt kommt zwar ein Ergebnis, aber etwas Kurrios:
aus (innerer select => die einzelnen Jobzeiten)
105, 105, 105, 100, 108, 103, 105, 101, 98, 108, 106, 106
wurde
100, 54, 101, 26.25, 103, 98, 53 (was ja nicht wirklich ein durchschnitt ist sondern nur viele werte, bei denen keiner wirklich an den schnitt rankommt)

SQL:
SELECT calc.DauerSekunden / COUNT(*) AS durchschnitt
FROM
  (
  SELECT ROUND((NVL(tbl.stop_zeit, SYSDATE) - tbl.start_zeit) * 24 * 60 * 60) AS DauerSekunden
  FROM db_sys.tabelle tbl
  WHERE trunc(tbl.start_zeit) = to_date('09.07.2015')
  AND tbl.bezeichnung LIKE ( 'JOB_FILTER' )
  ) calc
GROUP BY calc.DauerSekunden;
 
Das ist, weil ich blind deine Durchschnittsberechnung übernommen habe. Du musst natürlich so rechnen
SQL:
SUM(calc.DauerSekunden) / COUNT(*)

Eigentlich müsste aber auch das funktionieren
SQL:
AVG(calc.DauerSekunden)

Zum GROUP BY
Den ganz weglassen. Es macht ja keinen Sinn nach der Dauer zu gruppieren....
 
das Funktioniert beides gleich gut.

allerdings bekomme ich immer noch 7 statt einen Wert zurück:

=> diesmal etwas Realistischer:
100
108
101
105
103
98
106

SOLL: 104,17

irgendwie funktioniert das Group by nicht richtig...

SQL:
SELECT *
FROM
  (
  SELECT ROUND((NVL(tbl.stop_zeit, SYSDATE) - tbl.start_zeit) * 24 * 60 * 60) AS DauerSekunden
  FROM ec_sys.SCHED_JOBZEITEN tbl
  WHERE trunc(tbl.start_zeit) = to_date('09.07.2015')
  AND tbl.bezeichnung LIKE ( 'Basisabos ausrollen' )
  ) calc
GROUP BY calc.DauerSekunden;

=> gibt mir die selben 7 Werte zurück
 
Ich hab doch geschrieben. Den GROUP BY weglassen
SQL:
SELECT AVG(calc.DauerSekunden)
FROM (
  SELECT ROUND((NVL(tbl.stop_zeit, SYSDATE) - tbl.start_zeit) * 24 * 60 * 60) AS DauerSekunden
  FROM ec_sys.SCHED_JOBZEITEN tbl
  WHERE trunc(tbl.start_zeit) = to_date('09.07.2015')
  AND tbl.bezeichnung LIKE ( 'Basisabos ausrollen' )
  ) calc
 
Zurück