【问题标题】:Defining number of decimals in teradata column during Select statement在 Select 语句期间定义 teradata 列中的小数位数
【发布时间】: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 并返回呢?

标签: sql sas teradata


【解决方案1】:

SAS 将所有数字存储为 8 字节浮点数。有效十进制数字的最大位数小于 20。您的值真的大于 9,999,999,999,999.99 吗?你试过 DECIMAL(15,2) 吗?

您可以将值转换为 FLOAT 并在 SAS 端附加格式以仅显示 2 位小数。

create table my_dataset as
select wac format=20.2 
from connection to teradata (
   select cast( .... as FLOAT) as wac
   from ...
);

如果您确实需要准确存储 20 个十进制数字,则需要将值拆分为两个字段。

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2011-02-15
    • 2015-06-23
    • 1970-01-01
    • 2014-03-29
    • 2022-01-19
    相关资源
    最近更新 更多