Сохранить значение из двух операторов выбора в двух разных переменных - PullRequest
0 голосов
/ 02 апреля 2012

Какой самый простой и простой способ сохранить два значения из двух разных операторов выбора?

У меня есть запрос, подобный следующему:

SELECT * FROM (
SELECT FIELD1 FROM (<SUB SELECT STATMENT>)
UNION ALL
SELECT FIELD2 FROM (<SUB SELECT STATMENT>)) 

Что я хотел бы, чтобысохраните значение из FIELD1 и FIELD2, чтобы позже я мог выполнить некоторое вычисление с ним, например, FIELD1 / FIELD2.Я пытался использовать курсор, но столкнулся с проблемами.И это слишком сложно для выбора заявления.Любые предложения?

ОБНОВЛЕНИЕ:

Набор результатов из моего текущего запроса выглядит следующим образом.

SUM_OF_MESSAGES  | LABEL
----------------------------
      145323     | PUSHED
      2633267    | RECEIVED
                 |

Я бы хотел взять значения из первых двух строк и разделить их.Например.145323/2633267

Другими словами, есть ли способ разделить FIELD1 на FIELD2 из моего запроса выше?

ДРУГОЕ ОБНОВЛЕНИЕ:

Вот мой запрос:

SELECT SUM(R.MESSAGES) AS SUM_OF_MESSAGES, CASE WHEN R.LABEL = 1 THEN 'PUSHED' WHEN R.LABEL = 2 THEN 'RECEIVED' END AS LABEL FROM (                
SELECT SUM(Q.MESSAGES) AS "MESSAGES", 1 LABEL FROM (
SELECT USER_LOGIN,
                 EVENT_MSG,
                 ROW_LST_UPD_TS,
                 COMPONENT_NAME,
                 REGEXP_SUBSTR (SUBSTR (EVENT_MSG, INSTR (EVENT_MSG, ' ', 1, 1), INSTR (EVENT_MSG, ' ', 1, 1)), '[0-9]+') AS "MESSAGES"
            FROM EVENT_MGT.EVENT_LOG
            WHERE ROW_LST_UPD_TS BETWEEN (TRUNC (:DATEINPUT) - 1) + 5 / 86400 AND (TRUNC (:DATEINPUT)) + 5 / 86400
                 AND EVENT_ID = 101
                 AND COMPONENT_NAME LIKE '%Web ICE Downloader.exe%'
        GROUP BY COMPONENT_NAME,
                 USER_LOGIN,
                 EVENT_MSG,
                 ROW_LST_UPD_TS
                 ORDER BY ROW_LST_UPD_TS ) Q         
UNION ALL           
SELECT SUM(Q.MESSAGES) "MESSAGES", 2 LABEL FROM (
SELECT USER_LOGIN,
                 EVENT_MSG,
                 ROW_LST_UPD_TS,
                 COMPONENT_NAME,
                 REGEXP_SUBSTR (SUBSTR (EVENT_MSG, INSTR (EVENT_MSG, ' ', 1, 1), INSTR (EVENT_MSG, ' ', 1, 1)), '[0-9]+') AS "MESSAGES"
            FROM EVENT_MGT.EVENT_LOG
            WHERE ROW_LST_UPD_TS BETWEEN (TRUNC (:DATEINPUT) - 1) + 5 / 86400 AND (TRUNC (:DATEINPUT)) + 5 / 86400
                 AND EVENT_ID = 100
                 AND COMPONENT_NAME LIKE '%Web ICE Downloader.exe%'
        GROUP BY COMPONENT_NAME,
                 USER_LOGIN,
                 EVENT_MSG,
                 ROW_LST_UPD_TS
                 ORDER BY ROW_LST_UPD_TS ) Q ) R
                 GROUP BY  R.LABEL

Вот мой набор результатов:

SUM_OF_MESSAGES  | LABEL
----------------------------
      145323     | PUSHED
      2633267    | RECEIVED
                 |

Я хотел бы разделить два числа в одном операторе выбора.Пожалуйста, помогите.

1 Ответ

1 голос
/ 02 апреля 2012

Похоже, вам нужен только один запрос с небольшим количеством логики в ваших агрегатах

      SELECT COUNT( CASE WHEN event_id = 100 
                         THEN q.messages
                         ELSE null
                     END) Received,
             COUNT( CASE WHEN event_id = 101
                         THEN q.messages 
                         ELSE null
                     END) Pushed,
             COUNT( CASE WHEN event_id = 101
                         THEN q.messages 
                         ELSE null
                     END) /
                COUNT( CASE WHEN event_id = 100 
                           THEN q.messages
                           ELSE null
                       END) Pushed_Over_Received
        FROM (
          SELECT USER_LOGIN,
                 EVENT_ID,
                 EVENT_MSG,
                 ROW_LST_UPD_TS,
                 COMPONENT_NAME,
                 REGEXP_SUBSTR (SUBSTR (EVENT_MSG, INSTR (EVENT_MSG, ' ', 1, 1), 
                 INSTR (EVENT_MSG, ' ', 1, 1)), '[0-9]+') AS "MESSAGES"
            FROM EVENT_MGT.EVENT_LOG
            WHERE ROW_LST_UPD_TS BETWEEN (TRUNC (:DATEINPUT) - 1) + 5 / 86400 
                                     AND (TRUNC (:DATEINPUT)) + 5 / 86400
              AND EVENT_ID in( 100, 101 )
              AND COMPONENT_NAME LIKE '%Web ICE Downloader.exe%'
        )

С другой стороны, вы можете сделать что-то подобное с аналитическими функциями (вы хотите заменить подзапрос t в моем запросе на написанный вами запрос, который выдает две строки вывода)

SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2    select 145323 sum_of_messages, 'PUSHED' label from dual
  3    union all
  4    select 2633267, 'RECEIVED' from dual
  5  )
  6  select sum_of_messages,
  7         label,
  8         round( 100*ratio_to_report(sum_of_messages) over (), 2) pct_of_messages
  9*   from t
SQL> /

SUM_OF_MESSAGES LABEL    PCT_OF_MESSAGES
--------------- -------- ---------------
         145323 PUSHED              5.23
        2633267 RECEIVED           94.77
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...