Функция Oracle SQLPLUS AVG при использовании оператора CASE - PullRequest
0 голосов
/ 11 декабря 2018

Для отчета о производительности на 4 серверах я хочу получить AVG на сервер за период, в данном случае 1 минуту.Я могу получить COUNT и MAX, но не AVG (остаться) на сервер.Каждый сервер идентифицируется столбцом CREATE_APP_LOC_ID со значениями 0,1,2 или 3. Что я делаю неправильно в моем запросе?

Спасибо за вашу помощь.

вывод выглядит так:

                     Overall                                           server_1                server_2                server_3                server_4 
                                   Max     Avg                                  Max    Avg              Max    Avg              Max    Avg              Max    Avg
End Time             TXN   TPS    Stay    Stay   Appr   Decl Other       TXN   Stay   Stay       TXN   Stay   Stay       TXN   Stay   Stay       TXN   Stay   Stay
---------------- ------- ----- ------- ------- ------ ------ ----- --------- ------ ------ --------- ------ ------ --------- ------ ------ --------- ------ ------
2018-12-10 16:40    2354    39     513      74   1345   1008     1       599    316     11       559     48      7       599    513     29       597    328     28

Этот запрос используется:

ACCEPT start_time CHAR PROMPT 'Enter start time (yyyy-mm-dd hh:mm): '
ACCEPT stop_time CHAR PROMPT 'Enter end time (yyyy-mm-dd hh:mm)  : '

DEFINE time_diff = 1

SELECT TO_CHAR((MIN(end_time)+(&time_diff/24)), 'YYYY-MM-DD HH24:MI') c1, COUNT(*) c2,
       COUNT(*)/60 c3,
       MAX(stay) c4, ROUND(AVG(stay)) c5,
       SUM (CASE WHEN SUBSTR(TXN.RES_CODE,1,3) = 'APP' THEN 1 ELSE 0 END) c10,
       SUM (CASE WHEN SUBSTR(TXN.RES_CODE,1,3) = 'DEC' THEN 1 ELSE 0 END) c11,
       SUM (CASE WHEN SUBSTR(RES_CODE,1,3) <> 'APP' AND SUBSTR(RES_CODE,1,3) <> 'DEC' THEN 1 ELSE 0 END) c12,
/*server_1*/
       SUM (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 0 THEN 1 ELSE 0 END) c13,
       MAX (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 0 THEN stay ELSE 0 END) c20,
       AVG (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 0 THEN stay ELSE 0 END) c21, 
/*server_2*/
       SUM (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 1 THEN 1 ELSE 0 END) c14,
       MAX (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 1 THEN stay ELSE 0 END) c20,
       AVG (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 1 THEN stay ELSE 0 END) c21,
/*server_3*/
       SUM (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 2 THEN 1 ELSE 0 END) c15,
       MAX (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 2 THEN stay ELSE 0 END) c20,
       AVG (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 2 THEN stay ELSE 0 END) c21, 
/*server_4*/
       SUM (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 3 THEN 1 ELSE 0 END) c16,
       MAX (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 3 THEN stay ELSE 0 END) c20
       AVG (CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) = 3 THEN stay ELSE 0 END) c21  
FROM txn
WHERE txn_origin_id NOT IN (2,3)
  AND end_time >= '&start_time'
  AND end_time  < '&stop_time'
GROUP BY TO_CHAR(end_time, 'YYYY-MM-DD HH24:MI')
ORDER BY 1;

1 Ответ

0 голосов
/ 12 декабря 2018

Согласно моему предположению, вы получаете неправильную AVG из-за ELSE 0 части.Попробуйте использовать:

ROUND(AVG((CASE WHEN SUBSTR(CREATE_APP_LOC_ID, 1, 1) in (0,1,2,3) THEN stay ELSE 0 END))) c5,

вместо

ROUND(AVG(stay)) c5,
...