2014-02-11 3 views
0

2 쿼리와 2 회 함수 호출 2 회 msg_sys_no 카운트와 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 INTO :

는 다음과 같이하십시오. msg_when_created 'YYYY-MM-DD') = in_start_date AND b1.msg_service_provider = in_svc_provider AND IN ('TRADE1', 'TRADE2') AND get_transaction_status_func (b1.msg_sys_no, b1.msg_trans_type) = 'S'를 b1.msg_trans_type ; – 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 출력 매개 변수에 데이터를 저장하는 방법 .. – user3266456

0

문제는 당신의 AND IN b1.msg_trans_type ('TRADE1을', 'TRADE2') 조건. tra_message의 B1 TO_CHAR (B1로부터

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를 제공해야하는 곳 ... 명확히 ... b1.msg_trans_type = 'TRADE1' then b1.msg_trans_type 여기에 오는 값 ... 설명해주세요 – user3266456

+0

IN 절의 문제점은 TRADE1 또는 TRADE2 값과 일치하는 모든 레코드에 count (distinct)를 모두 적용한다는 것입니다. 그래서 저는 두 가지 모두에서 같은 가치를 얻는다고 생각합니다. 내 경우 명령의 목적은 어떤 레코드가 첫 번째 조건을 만족시키고 다른 하나는 두 번째 조건을 만족하는지 구별하는 것입니다. 따라서 "a"열은 TRADE1에 대해서만 계산하려는 값을 표시합니다. TRADE2와 동일한 기술. 마지막으로 두 고유 한 값을 정확하게 계산할 수 있습니다. 나는 당신이 필요로하는 MSG_SYS_NO 카운트를 얻기 위해 SQL 문을 업데이트했다 ... –

+0

당신의 설명에 감사드립니다. – user3266456

관련 문제