Używam poniższego zapytania,

SELECT CASE WHEN val_desc = 'united states' THEN 'USD',
            WHEN val_desc = 'ITALY'         THEN 'EUR' END AS key_p,
       avg((a.end_date - a.start_time)*24*60*60) as average, VAL_DESC
from empl a
group by VAL_DESC

Oczekiwane dane wyjściowe jako (w sekundach). 2.3 USD 1.2 EUR

Wskazówka: - mamy rekordy w tabelach, które (a.end_date - a.start_time) będą miały 1 sekundę lub 2 sekundy lub 3 i tak nie ... więc potrzebuję średniej z tego.

0
Roger 16 grudzień 2019, 16:13
1
Czy rzeczywiście masz pytanie? To nie jest jasne.
 – 
Gordon Linoff
16 grudzień 2019, 16:15
Czy możesz udostępnić odpowiednie dane wejściowe i związane z nimi oczekiwane wyniki?
 – 
Popeye
16 grudzień 2019, 16:36
1
Masz tutaj przecinek: THEN 'USD',, który musisz usunąć, a kod będzie działał. Głosuję za zamknięciem pytania, ponieważ problem to tylko literówka.
 – 
forpas
16 grudzień 2019, 17:02
Jestem bardziej skoncentrowany na AVG ((a.end_date - a.start_time)*24*60*60), aby obliczyć w sekundach. więc oczekiwanym wyjściem jest uzyskanie średniej wszystkich rekordów (data_końcowa - czas_początkowy) w sek.
 – 
Roger
16 grudzień 2019, 17:11
, oprócz przecinka jest też grupowanie według którego spowoduje błąd zapytania. Myślę, że powinieneś wycofać swój głos. To zależy od ciebie, po prostu dzielę się z tobą więcej szczegółów.
 – 
Popeye
16 grudzień 2019, 18:44

2 odpowiedzi

Podejrzewam, że chcesz mieć dwa wiersze w zestawie wyników, a GROUP BY Cię wyrzuca. W takim razie:

SELECT (CASE WHEN val_desc = 'united states' THEN 'USD'
             WHEN val_desc = 'ITALY' THEN 'EUR'
        END) AS key_p, 
       AVG((a.end_date - a.start_time)*24*60*60) as average
FROM empl e 
GROUP BY (CASE WHEN val_desc = 'united states' THEN 'USD'
               WHEN val_desc = 'ITALY' THEN 'EUR'
          END);
2
Gordon Linoff 16 grudzień 2019, 16:17
Jestem bardziej skupiony na AVG ((a.end_date - a.start_time)*24*60*60) , czy to daje mi poprawny wynik (mam na myśli średnią wszystkich rekordów (end_date - start_time) w sekundach)?
 – 
Roger
16 grudzień 2019, 17:10
GROUP BY jest w porządku, jak to jest. Jedynym problemem jest tutaj przecinek: THEN 'USD',: sqlfiddle.com/#!4/ 7b grudnia6/9
 – 
forpas
16 grudzień 2019, 19:51

Twoje pytanie jest dla mnie trochę niejasne.

Dlatego podaję ogólną odpowiedź, mając nadzieję, że da ci ona właściwy kierunek.

Oracle dates składa się z date + time do sekund. A różnica w dates zwraca liczbę dni między dates.

Weźmy prosty przykład

First record:

start_date = 16-dec-2019 12:25:01 
End_date = 16-dec-2019 12:26:01
Diff: 60 seconds

Second record:

start_date = 15-dec-2019 09:25:01 
End_date = 15-dec-2019 10:25:01 
Diff: 3600 seconds

Poniższe pytania pomogą ci zrozumieć logikę

-- 1 -- average in number of days (around 1/24 will be the result)
Select avg(end_date-start_date) 
From your_table

-- 2 -- average in number of hours (around 0.5 will be the result)
Select avg(end_date-start_date) * 24
From your_table

-- 3 -- average in number of minutes (30.5 will be the result)
Select avg(end_date-start_date) * 24 * 60
From your_table

-- 4 -- average in number of seconds (1830 will be the result)
Select avg(end_date-start_date) * 24 * 60 * 60
From your_table

Twoje zdrowie!!

2
Popeye 16 grudzień 2019, 19:21