2012-04-02 41 views
-1

从两个不同的select语句中保存两个值的最好和最简单的方法是什么?将两个select语句的值保存在两个不同的变量中

我有一个查询是这样的:

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

我想什么是保存FIELD1和FIELD2值,以便以后我可以做一些calulation有了它,如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 
       | 

我想这两个数字在同一个SELECT语句划分。请帮忙。

+0

我不明白。这个查询可以返回任意数量的记录,那么说“FIELD1/FIELD2”是什么意思? – 2012-04-02 17:49:17

+0

保存它是什么意思?你在存储过程中谈论吗?或者使用诸如Java,C#或PHP之类的编程语言? – Churk 2012-04-02 17:50:06

+0

考虑到上面写的语句,您将只返回一个名为FIELD1的字段。我怀疑这不是你想到的。你能解释你想完成什么吗? – 2012-04-02 17:55:16

回答

1

好像你只需要在你的聚集

 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 
+0

贾斯汀。美丽。谢谢。你是第一选择伟大的工作。 – Zolt 2012-04-02 19:01:17