2012-08-30 6 views
0

내가 그룹 function.Here 내가 NVL 기능을 사용하고 또한 디코딩하지만 한 쿼리디코드

SELECT DECODE (DIRAPP, NULL, 'SML', DIRAPP) DD 
    FROM (SELECT  'At Director Approval ' 
       || NVL (COUNT (*), 0) 
       || ' Cheques of Rs. ' 
       || NVL (TO_CHAR (SUM (BPV_AMT), '9,999,999,999'), 0) 
       || ' in ' 
       || CONCATENATE_LIST 
           (CURSOR (SELECT DISTINCT NVL 
                  (BPV_DTE, 
                   SYSDATE 
                  ) BPV_DTE 
                FROM CHECK_DATA 
                WHERE STA_FLG IN (1, 3) 
               ORDER BY 1 DESC 
             ) 
           ) DIRAPP 
      FROM CHECK_DATA 
      WHERE STA_FLG IN (1, 3) 
     GROUP BY 1, 2) A 

이다 사용 여기에 간단한 쿼리를 오라클 SQL 쿼리에서 작동하지 않는 경우 플래그 1에 대해 데이터 없음 및 3 다음 아무것도 NVL에서 0도 표시되지 않습니다 또한 작업 decode.I이 파손되지 않은 한이

+0

질문에 대답하십시오. – user1583775

답변

3

decode을 할 수 제발 도와주세요 At Director Approval 0 Cheques of Rs.0로와 전체 문자열을 보여주고 싶은, 그냥 작업 할 데이터가 없습니다 . where sta_flg in (1,3)에 필터링 중이므로 두 상태 중 하나의 레코드가없는 경우 행이 전혀 없습니다. 존재하지 않는 것을 디코딩 할 수 없습니다.

이 문제를 해결하는 방법 중 하나는 where이 아닌 select 내에서 필터링이 효과적으로 이루어 지도록 값을 계산하고 합산하는 방식을 변경하는 것입니다. 잠시 서식을 제거보다는 일 : 테이블에 다른 데이터가있는 경우에도 일치하는 플래그와 함께 레코드가없는 경우에는 행을 반환하지 않습니다

SELECT COUNT(*), SUM(BPV_AMT) 
FROM check_data 
WHERE sta_flag IN (1,3); 

이 ..., 당신이 할 수 있습니다

SELECT SUM(CASE WHEN sta_flg IN (1,3) THEN 1 ELSE 0 END) AS rec_cnt, 
    SUM(CASE WHEN sta_flg IN (1,3) THEN bpv_amt ELSE 0 END) AS bpv_amt_tot 
FROM check_data; 

만큼 테이블이 비어 있지 않고,이 정상 값 또는 모두 0과 rec_cntbpv_amt_tot 세트 중 하나와 한 행의 데이터를 리턴한다.

처럼 보일 수 있습니다 쿼리를 선택 내부로 그 꽂 :

SELECT 'At Director Approval ' 
    || rec_cnt 
    || ' Cheques of Rs. ' 
    || TO_CHAR(bpv_amt_tot, '9,999,999,999') 
    || CASE WHEN rec_cnt = 0 THEN NULL 
     ELSE ' in ' || CONCATENATE_LIST(CURSOR(
      SELECT DISTINCT NVL(bpv_dte, SYSDATE) 
      FROM check_data 
      WHERE sta_flg IN (1, 3) 
      ORDER BY 1 DESC 
     )) END AS dirapp 
FROM (
    SELECT SUM(CASE WHEN sta_flg IN (1,3) THEN 1 ELSE 0 END) AS rec_cnt, 
     SUM(CASE WHEN sta_flg IN (1,3) THEN bpv_amt ELSE 0 END) AS bpv_amt_tot 
    FROM check_data 
); 

case' in ' || CONCATENATE_LIST(... 부분 주위가 일치하는 상태가없는 경우 바로 나타나는 후행 in을 방지하는 것입니다.

집계되지 않은 열을 선택하지 않으므로 group by 절이 필요하지 않습니다. (그리고 어쨌든 잘못된 것이 었습니다. 열 위치별로 그룹화 할 수 없으므로, group by 1,2은 두 개의 상수 값으로 그룹화됩니다 (아무 것도 추가하지 않음).

마지막으로, concatenate_list()을 사용하고 있으므로 11gR2 이전 버전을 사용하고 있다고 가정합니다. 현재 버전을 사용하고 있다면 내장형 listagg()이 더 간단해질 것입니다.

+0

Oracel을 사용하고 있습니다. 10g 그 이유는 제가 managualy listagg()를 작성해야하는 이유입니다. – user1583775