2014-02-11 70 views
0

我有2个查询并且调用了一个函数2次我只需要根据msg_sys_no count和msg_trans_type调用函数一次。 请找到下面提到的查询,并为我提供合并为单一的解决方案。将多个查询合并为单个查询

SELECT COUNT(DISTINCT b1.msg_sys_no) INTO A 
    FROM tra_message b1 
    WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date 
    AND b1.msg_service_provider     = in_svc_provider 
    AND b1.msg_trans_type = 'TRADE1' 
    AND get_transaction_status_func(b1.msg_sys_no, b1.msg_trans_type) = 'S'; 

SELECT COUNT(DISTINCT b1.msg_sys_no) INTO B 
    FROM tra_message b1 
    WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date 
    AND b1.msg_service_provider     = in_svc_provider 
    AND b1.msg_trans_type = 'TRADE2' 
    AND get_transaction_status_func(b1.msg_sys_no, b1.msg_trans_type) = 'S'; 
+0

SELECT COUNT(DISTINCT b1.msg_sys_no)TRADE1, COUNT(DISTINCT b1.msg_sys_no)TRADE2 分为A,B FROM tra_message B1 WHERE TO_CHAR(B1。 msg_when_created, 'YYYY-MM-DD')= in_start_date AND b1.msg_service_provider in_svc_provider = AND IN b1.msg_trans_type( 'TRADE1', 'TRADE2') AND get_transaction_status_func(b1.msg_sys_no,b1.msg_trans_type)= 'S' ; – user3266456

+0

但它给出了错误的数字,你能否给我提供我出错的细节? – user3266456

回答

0

大约是这样的内容:

WITH tra_data 
    AS (SELECT * 
      FROM tra_message 
      WHERE TO_CHAR (msg_when_created, 'YYYY-MM-DD') = in_start_date 
       AND msg_service_provider = in_svc_provider 
       AND get_transaction_status_func (msg_sys_no, msg_trans_type) = 
         'S') 
SELECT COUNT (*) 
    FROM tra_data 
WHERE msg_trans_type = 'TRADE1' 
UNION 
SELECT COUNT (*) 
    FROM tra_data 
WHERE msg_trans_type = 'TRADE2' 
+0

我们如何计算msg_sys_no并将数据存储到A,B out参数中。 – user3266456

0

的问题是,您和IN b1.msg_trans_type( 'TRADE1', 'TRADE2')的条件。

尝试是这样的:

select COUNT(DISTINCT a) TRADE1, 
     COUNT(DISTINCT b) TRADE2 
into A,B 
from (
select case when b1.msg_trans_type = 'TRADE1' 
      then b1.msg_sys_no 
      else null end as a, 
     case when b1.msg_trans_type = 'TRADE2' 
      then b1.msg_sys_no 
      else null end as b 
FROM tra_message b1 
WHERE TO_CHAR(b1.msg_when_created,'YYYY-MM-DD') = in_start_date 
AND b1.msg_service_provider = in_svc_provider 
AND b1.msg_trans_type IN ('TRADE1','TRADE2') 
AND get_transaction_status_func(b1.msg_sys_no, b1.msg_trans_type) = 'S' 
); 
+0

嗨,感谢您的解释,但我们需要在此代码中提供b1.msg_sys_no ..请澄清...以及case when b1.msg_trans_type ='TRADE1' 然后b1.msg_trans_type这里有什么价值...请解释 – user3266456

+0

IN子句的问题在于,您应将count(distinct)应用于与TRADE1或TRADE2值相匹配的每条记录。所以我认为你的计数都会得到同样的价值。我的案例命令的目的是区分哪个记录满足第一个条件,哪个满足第二个条件。因此,“a”列显示了您只希望计算TRADE1的值; TRADE2的相同技术。最后,您可以正确计算两个不同的值。我已更新我的SQL语句以获取您需要的MSG_SYS_NO数量... –

+0

感谢您的解释 – user3266456