将多个查询合并为单个查询
我有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';
大约是这样的内容:
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'
我们如何计算msg_sys_no并将数据存储到A,B out参数中。 – user3266456
的问题是,您和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'
);
嗨,感谢您的解释,但我们需要在此代码中提供b1.msg_sys_no ..请澄清...以及case when b1.msg_trans_type ='TRADE1' 然后b1.msg_trans_type这里有什么价值...请解释 – user3266456
IN子句的问题在于,您应将count(distinct)应用于与TRADE1或TRADE2值相匹配的每条记录。所以我认为你的计数都会得到同样的价值。我的案例命令的目的是区分哪个记录满足第一个条件,哪个满足第二个条件。因此,“a”列显示了您只希望计算TRADE1的值; TRADE2的相同技术。最后,您可以正确计算两个不同的值。我已更新我的SQL语句以获取您需要的MSG_SYS_NO数量... –
感谢您的解释 – user3266456
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
但它给出了错误的数字,你能否给我提供我出错的细节? – user3266456