【发布时间】:2019-12-01 18:53:09
【问题描述】:
在 SAS Enterprise guide 环境中的 teradata proc sql 中,我试图通过将两个字段相乘来创建一列,但我一直遇到溢出问题。如何在 Select 语句期间指定结果字段中的小数位数?数字(20,2)
proc sql exec feedback stimer;
connect to teradata as teravw (authdomain=teradataauth TDPID=DWPROD2 MODE=TERADATA SCHEMA=EDW_NOPHI CONNECTION=GLOBAL);
CREATE TABLE WORK.tbl1 AS
SELECT * from connection to teravw
(SELECT
...
,case
when PCL.CLM_SOR_CD = '512' then cast(round(sum(PCL.PRCG_WHLSL_ALWBL_COST_AMT * CL.PAID_SRVC_UNIT_CNT) ,0.01) as numeric(20,2))
else SUM(PCL.PRCG_WHLSL_ALWBL_COST_AMT)
end AS WAC
...
);
disconnect from teravw;
quit;
run;
错误信息:
ERROR: Teradata row not delivered (trget): Numeric overflow occurred during computation.
【问题讨论】:
-
如果没有有关基础列数据类型的信息,很难确定,但很可能您需要一个 CAST inside SUM
-
这是 SAS 错误还是 TERADATA 错误?
-
这是一个 SAS 错误。如果 SELECT 语句返回的某些内容不能适合 SAS 数据类型,则会发生此错误。正如@Fred 建议的那样,它需要对返回的数据进行一些类型转换/转换。
-
20 位有效十进制数字超过了 SAS 可以存储的 8 字节 IEEE 浮点值用于数字。为什么不直接将值转换为 FLOAT 并返回呢?