总和上的奇数行为(获取数字溢出)

Jef*_*mer 5 sas teradata

我正在使用SAS proc sql查询并发现了一些奇怪的东西.首先,我尝试了这个简单的查询:

proc sql;
  CREATE TABLE test AS 
    (SELECT
       YEAR(dt) AS yr,
       MONTH(dt) AS mo,
       SUM(val) AS total
     FROM
       mydb1234.myTable
     WHERE
       myDate BETWEEN x AND y
     GROUP BY
       yr, mo);
run;
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,我收到此错误:

ERROR: Teradata row not delivered (trget): Numeric overflow occurred during computation.
Run Code Online (Sandbox Code Playgroud)

据我所知,当我的求和值太大而无法适应proc sql试图使用的数据类型时,会发生这种情况.

我决定将我总结的数字除以:

SUM(val/1000) AS total
Run Code Online (Sandbox Code Playgroud)

但是,这会产生意想不到的后果.总和小于我在Excel中所做的手动总和.随着我向除数增加更多的数量级,总数会降低.我猜这是消除它试图求和的较小值(例如10/1000 vs 108/10000等),它们永远不会达到总和,而是被读作零.

有没有办法强制这个proc sql使用可以容纳我的总值的字段长度创建一个表?它们的数量在十亿 - 千亿之间,所以我认为这并不奇怪.我很想知道你们的想法.

Joe*_*Joe 5

我怀疑发生了什么是通过隐式传递将查询推回到Teradata,因此Teradata中的某些东西不起作用.您可能需要查询显式地将总和转换为除了它之外的其他内容.

要查看确切的情况,请使用OPTIONS SASTRACE ; 从建议尝试的文档

options sastrace=',,,d' sastraceloc=saslog nostsuffix;
Run Code Online (Sandbox Code Playgroud)

虽然你可能需要选择一些选项.这将显示在Teradata中执行的确切查询.直接在Teradata中尝试相同的查询,看看是否可以防止它出现同样的问题.

一旦你想出来,你可以使用显式传递执行正确的查询; 即

proc sql;
 connect to teradata [options, same as on the libname usually];
 create table mydata as select * from connection to teradata (
   ... actual teradata syntax ...
 );
quit;
Run Code Online (Sandbox Code Playgroud)


Jef*_*mer 1

正如乔之前指出的那样,我将调查导致此问题的根本问题。但是,我找到了解决根本问题的快速解决方法。我使用了以下行SUM

Round((SUM(myField))/1) format=13. 
Run Code Online (Sandbox Code Playgroud)