Berechnung in SQL String

drzwockel

Benutzer
Beiträge
9
Hallo,

ich habe gerade ein Problem bei der Berechnung eines Monatswertes. Es werden aus einer Tabelle für einen Monat der Mittelwert einer Zeit berechnet. Dies funktioniert mit der Function AVG recht gut:

Code:
SELECT avg(erz_sekunden) AS WERT
FROM
SCHEMA.TABELLE
WHERE
NR = '9999'
AND
ORGA LIKE '99011%'
YYYYMM BETWEEN '201500' AND '201512'
GROUP BY YYYYMM;

Jetzt würde ich in diesem Arbeitsschritt jedoch aus diesem Ergebnis eine Uhrzeit berechnen lassen. Soll heißen, dass ich gerne das Ergebnis WERT wie folgt berechnen würde:

WERT/86400 AS ERGEBNIS

Leider funktioniert meine Idee nicht so, wie es mir "ausgedacht" habe. Hat jemand eine Idee, wie ich das dennoch hin bekomme?


Gruß vom Doc
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Datentyp?

was passiert bei select (avg(erz_sekunden)) / 86400 ? Dann bekommst aber keine Uhrzeit, sondern eine Zeitspanne. Und YYYYMM mit 201500 ist auch Quark, das Jahr begint mit Monat 1.
 
1. WAS funktioniert nicht?... Woran scheitert dein Versuch durch 864000 zu teilen? Mathematische Operatoren kann Oracle ganz gut...
2. Wenn du einfach nur eine Uhrzeit im Textformat willst... numtodsinterval und dan nein paar extracts drüber...
Code:
Select to_char(extract(hour From numtodsinterval(val, 'second')), 'FM00') || ':' ||
       to_char(extract(minute From numtodsinterval(val, 'second')), 'FM00') || ':' ||
       to_char(extract(Second From numtodsinterval(val, 'second')), 'FM00') as uhrzeit
From   (Select Level As val
        From   dual
        Connect By Level <= 86400);

Edit:
Mir ist was schöneres eingefallen...
Code:
Select to_char(trunc(Sysdate) + numtodsinterval(val, 'second'), 'HH24:MI:SS') As uhrzeit
From   (Select Level As val
        From   dual
        Connect By Level <= 86400);
 
Zuletzt bearbeitet:
Hallo akretschmer,

vielen Dank für Deinen Tipp ... funktioniert jetzt, so wie es sein soll ... Danke auch an distrilec für seinen Beitrag.

Jetzt habe ich nur noch eine Frage/Problem/Herausforderung:

Ich habe jetzt die einzelnen Monatswerte. Wie sieht es aber aus, wenn ich die Werte für die einzelnen Mpnate kummuliert ausgeben möchte:

Jan: 10
Feb: 12
Mrz: 5

usw...

Ergebnis:
Jan: 10
Feb. 22
Mrz. 27

usw. ...


?

Hat da jemand noch eine Idee/Antwort drauf?


Gruß vom Doc
 
um es kurz zu zeigen:

Code:
test=*# create table foo as select s as id, (random()*100)::int as val from generate_series(1,10) s;
SELECT 10
test=*# select *, sum(val) over (rows between unbounded preceding and current row ) from foo;
 id | val | sum
----+-----+-----
  1 |  4 |  4
  2 |  23 |  27
  3 |  56 |  83
  4 |  18 | 101
  5 |  48 | 149
  6 |  74 | 223
  7 |  5 | 228
  8 |  33 | 261
  9 |  27 | 288
 10 |  50 | 338
(10 rows)
 
Der einzige Unterschied:
Oracle verlangt immer eine Order By-Clause damit man auch immer das gleiche ergebnis bekommt ;)
Code:
SQL> Select sum(level) over(rows between unbounded preceding and current row) From   dual Connect By level <= 12;
Select sum(level) over(rows between unbounded preceding and current row) From   dual Connect By level <= 12
ORA-30485: ORDER BY-Ausdruck fehlt in Fensterspezifikation

SQL>
Code:
SQL> Select sum(level) over(order by level asc rows between unbounded preceding and current row) From  dual Connect By level <= 12;
SUM(LEVEL)OVER(ORDERBYLEVELASC
------------------------------
  1
  3
  6
  10
  15
  21
  28
  36
  45
  55
  66
  78
12 rows selected

SQL>
 
Werbung:
Hallo,

vielen Dank für Eure Hinweise ... werde es mal auf der Testumgebung ausprobieren, damit ich mal das Ergebnis bei unseren Daten nachvollziehen kann ... :-)


Gruß vom Doc
 
Zurück
Oben