2016-06-01 3 views
0

이 오류가 발생했습니다. Teradata execute : 계산 중 숫자 오버플로가 발생했습니다.오류 : Teradata 실행 : 계산 중 숫자 오버플로가 발생했습니다.

이 포럼에서 비슷한 질문을 읽었지만 문제를 해결하기 위해 무엇을해야하는지 이해할 수 없습니다. 그 이유는 내가 DEBT_EXPENSE에 NATIONAL_AMOUNT를 정의 할 때 계산을해야한다고 가정했기 때문입니다.

CAST를 사용한 후에도 여전히 해결되지 않았습니다. 누구든지 생각하십니까? 도와주세요. ====================== 아래의 전체 코드 ========

EXECUTE (create multiset volatile table Debt_&mon. AS 
    (SELECT 
       t1.TABLE_BUSINESS_MONTH, 
       t1.REGION, 
       t1.SEGMENT, 
       t1.ACC_METH, 
       COUNT(t1.ACC_N) as Count_ACC_N, 
       SUM(t1.NATIONAL_UNPAID) AS NATIONAL_UNPAID, 
       SUM(t1.DEBT_EXPENSE) as DEBT_EXPENSE, 
       SUM(t2.NATIONAL_AMOUNT) as NATIONAL_AMOUNT, 
       (case when SUM(t2.NATIONAL_AMOUNT)=0 then 0 else (cast(SUM(t1.DEBT_EXPENSE) as Decimal(20,6))/cast(SUM(t2.NATIONAL_AMOUNT) as Decimal(20,6)) end) as 'РСДЗ/Д'n, 
       (case when SUM(t1.DEBT_EXPENSE)=0 then 0 else cast(SUM(t2.NATIONAL_AMOUNT) as Decimal(20,6))/cast(SUM(t1.DEBT_EXPENSE) as Decimal(20,6)) end) as 'Д/ДЗ'n 

      FROM Prev_Debt_&mon. t1 
      LEFT JOIN CLC_&mon. t2 on 
       t1.REGION=t2.REGION and 
       t1.SEGMENT=t2.SEGMENT and 
       t1.ACC_METH=t2.ACC_METH 
      GROUP BY t1.TABLE_BUSINESS_MONTH, t1.REGION, t1.SEGMENT, t1.ACC_METH) 

    WITH DATA NO PRIMARY INDEX ON COMMIT PRESERVE ROWS;) 
    by teradata; 

: 나는 문제가 여기에 있다고 생각 대신 INTEGER의 ============================

EXECUTE (create multiset volatile table CLC_&mon. AS 
(SELECT 
      t1.TABLE_BUSINESS_MONTH, 
      t1.REGION, 
      Case when t2.SEGMENT is Null then 'NEW' else t2.SEGMENT end as "SEGMENT", 
      t1.ACC_METH, 
      COUNT(t1.ACC_N) as Count_ACC_N, 
      SUM(t1.NATIONAL_AMOUNT) AS NATIONAL_AMOUNT, 
      SUM(t1.NATIONAL_AMOUNT)/COUNT(t1.ACC_N) as 'ARPaU'n 

     FROM UAT_V_BASE.RA_FCLC_ACC t1 
     LEFT JOIN prd_sbx_general.&login._LIST_MK_2 t2 ON (t1.MARKET_CATEGORY=t2.MARKET_CATEGORY) 
     GROUP BY t1.TABLE_BUSINESS_MONTH, t1.REGION, "SEGMENT", t1.ACC_METH 
     WHERE SEGMENT in ('B2C','B2B','VIP','OTHER') 
      AND t1.ACC_METH in (1, 2) 
      AND TABLE_BUSINESS_MONTH between &firstmonth. and &lastmonth. 
      AND MRGN_ID=&MR.) 
WITH DATA NO PRIMARY INDEX ON COMMIT PRESERVE ROWS;) 
by teradata; 

create table CLC_&mon. as select 
     TABLE_BUSINESS_MONTH FORMAT=Date9., 
     REGION FORMAT=FSRGC., 
     SEGMENT FORMAT=$9., 
     ACC_METH FORMAT=F78C., 
     Count_ACC_N, 
     NATIONAL_AMOUNT FORMAT=NUMX16.2 LABEL="(Сумма начислений с учетом налогов), RUB)", 
     'ARPaU'n 
from connection to teradata 
(select distinct 
     TABLE_BUSINESS_MONTH, 
     REGION, 
     SEGMENT, 
     ACC_METH, 
     Count_ACC_N, 
     NATIONAL_AMOUNT, 
     'ARPaU'n 
    GROUP BY TABLE_BUSINESS_MONTH, REGION, SEGMENT, ACC_METH, Count_ACC_N, NATIONAL_AMOUNT,'ARPaU'n 
    ORDER BY TABLE_BUSINESS_MONTH, REGION, SEGMENT, ACC_METH 
from CLC_&mon.); 

EXECUTE (create multiset volatile table Prev_Debt_&mon. AS 
(SELECT 
      t1.TABLE_BUSINESS_MONTH, 
      t1.REGION, 
      Case when t2.SEGMENT is Null then 'NEW' else t2.SEGMENT end as "SEGMENT", 
      t1.ACC_METH, 
      t1.BASE_AGE, 
      Case when t1.BASE_AGE=-1 then 'ОДЗ' 
       when t1.BASE_AGE=3 then 'CДЗ' 
       else 'Другая ДЗ' 
       end as "Tип ДЗ", 
      Case when t1.NATIONAL_UNPAID between 0 and 200000 then '0...200' 
       when t1.NATIONAL_UNPAID between 200000 and 500000 then '200...500' 
       else '> 500' end as 'Amount_of_Debt'n, 
      t1.ACC_N, 
      SUM(t1.NATIONAL_UNPAID) AS NATIONAL_UNPAID, 
      Case when t1.EXCEPTED_FROM_BUH eq 0 then (t1.NT_BUH_DELTA + t1.NT_WRITE_OFF) 
       else t1.NT_WRITE_OFF_COLLFIN 
       end AS DEBT_EXPENSE 

     FROM UAT_V_BASE.RA_FDEB_ACC t1 
     LEFT JOIN prd_sbx_general.&login._LIST_MK_2 t2 ON (t1.MARKET_CATEGORY=t2.MARKET_CATEGORY) 
     WHERE SEGMENT in ('B2C','B2B','VIP','OTHER') 
      AND t1.ACC_METH in (1, 2) 
      AND TABLE_BUSINESS_MONTH between &firstmonth. and &lastmonth. 
      AND MRGN_ID=&MR. 
     GROUP BY t1.TABLE_BUSINESS_MONTH, t1.REGION, "SEGMENT", t1.ACC_METH, t1.BASE_AGE,'Tип ДЗ'n, t1.ACC_N, 'Amount_of_Debt'n, "DEBT_EXPENSE") 
WITH DATA PRIMARY INDEX (ACC_N) ON COMMIT PRESERVE ROWS;) 
by teradata; 

EXECUTE (create multiset volatile table Debt_&mon. AS 
(SELECT 
      t1.TABLE_BUSINESS_MONTH, 
      t1.REGION, 
      t1.SEGMENT, 
      t1.ACC_METH, 
      COUNT(t1.ACC_N) as Count_ACC_N, 
      SUM(t1.NATIONAL_UNPAID) AS NATIONAL_UNPAID, 
      SUM(t1.DEBT_EXPENSE) as DEBT_EXPENSE, 
      SUM(t2.NATIONAL_AMOUNT) as NATIONAL_AMOUNT, 
      (case when SUM(t2.NATIONAL_AMOUNT)=0 then 0 else (cast(SUM(t1.DEBT_EXPENSE) as Decimal(20,6))/cast(SUM(t2.NATIONAL_AMOUNT) as Decimal(20,6)) end) as 'РСДЗ/Д'n, 
      (case when SUM(t1.DEBT_EXPENSE)=0 then 0 else cast(SUM(t2.NATIONAL_AMOUNT) as Decimal(20,6))/cast(SUM(t1.DEBT_EXPENSE) as Decimal(20,6)) end) as 'Д/ДЗ'n 

     FROM Prev_Debt_&mon. t1 
     LEFT JOIN CLC_&mon. t2 on 
      t1.REGION=t2.REGION and 
      t1.SEGMENT=t2.SEGMENT and 
      t1.ACC_METH=t2.ACC_METH 
     GROUP BY t1.TABLE_BUSINESS_MONTH, t1.REGION, t1.SEGMENT, t1.ACC_METH) 

WITH DATA NO PRIMARY INDEX ON COMMIT PRESERVE ROWS;) 
by teradata; 


Create table RSDZ_&mon. as select 
     TABLE_BUSINESS_MONTH FORMAT=Date9., 
     REGION FORMAT=FSRGC., 
     SEGMENT FORMAT=$9., 
     ACC_METH FORMAT=F78C., 
     Count_ACC_N, 
     NATIONAL_UNPAID FORMAT=NUMX16.2 , 
     DEBT_EXPENSE FORMAT=NUMX16.2, 
     NATIONAL_AMOUNT FORMAT=NUMX16.2, 
     'РСДЗ/Д'n FORMAT=NUMX16.10, 
     'Д/ДЗ'n FORMAT=NUMX16.10 

from connection to teradata 
(select distinct 
     TABLE_BUSINESS_MONTH, 
     REGION, 
     SEGMENT, 
     ACC_METH, 
     Count_ACC_N, 
     NATIONAL_UNPAID, 
     DEBT_EXPENSE, 
     NATIONAL_AMOUNT, 
     'РСДЗ/Д'n, 
     'Д/ДЗ'n 

    GROUP BY TABLE_BUSINESS_MONTH, REGION, SEGMENT, ACC_METH, Count_ACC_N, NATIONAL_UNPAID, DEBT_EXPENSE, NATIONAL_AMOUNT, 'РСДЗ/Д'n, 'Д/ДЗ'n 
    ORDER BY TABLE_BUSINESS_MONTH, REGION, SEGMENT, ACC_METH 

from Debt_&mon.); 
+1

Teradata 15.10 이전에는 COUNT() 집계가 INTEGER를 데이터 형식으로 사용했습니다. INTEGER 도메인을 초과하는 대형 데이터 세트로 작업 할 때 COUNT() 함수를 DECIMAL (15) 또는 BIGINT로 CAST해야하는 경우는 드뭅니다. 나는 당신의 범인으로'COUNT_ACC_N'로 시작할 것입니다. SUM()은 피연산자의 데이터 형식을 사용해야하며 일부 뉘앙스는 DECIMAL 데이터와 함께 정밀도를 사용합니다. –

답변

0

사용 BIGINT? DECIMAL 당신의 숫자 열을 캐스팅하면서

0

사실, 내 문제를 해결하는 방법을 찾았습니다. 전체 코드와 별개로 문제가 발생한 곳에서 코드를 가져 왔습니다. 로그에 "계산 중 숫자 오버플로가 발생했습니다."라는 오류가 나타납니다. 그러나 문제는 열 NATIONAL_AMOUNT으로 한숨 쉬었다. 그런 다음 SUM(t2.NATIONAL_AMOUNT) as NATIONAL_AMOUNT,t2.NATIONAL_AMOUNT으로 변경했습니다. 그 코드가 작동 한 후에.

나는 이전 단계에서 나의 t2.NATIONAL_AMOUNT을 집계했으며 나는 두 번 그것을 동의해야한다.

관련 문제