首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求和(获取数字溢出)的奇数性态

求和(获取数字溢出)的奇数性态
EN

Stack Overflow用户
提问于 2013-07-25 19:13:48
回答 3查看 2.4K关注 0票数 5

我正在处理一个SAS proc查询,发现了一些奇怪的东西。首先,我尝试了以下简单的查询:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
ERROR: Teradata row not delivered (trget): Numeric overflow occurred during computation.

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

我决定把我正在总结的数字除以:

代码语言:javascript
复制
SUM(val/1000) AS total

然而,这产生了意想不到的后果。之和总数小于我在Excel中所做的人工总和。当我把更多的数量级加到除数上时,总数就变低了。我猜这是在消除它试图求和的较小的值(例如。( 10/1000 vs 108/10000等)永远达不到和,而是被读为零。

是否有一种方法可以强制这个proc使用一个字段长度来创建一个表,该字段长度可以容纳我的总价值?它们在十亿到千亿的范围内,所以我认为没有什么不寻常的。我很想看看你们怎么想的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-25 21:29:02

正如Joe前面所指出的,我将调查导致这一问题的潜在问题。然而,我找到了一个解决根本问题的快速解决办法。我在我的SUM中使用了以下一行

代码语言:javascript
复制
Round((SUM(myField))/1) format=13. 
票数 1
EN

Stack Overflow用户

发布于 2013-07-25 19:50:42

我怀疑正在发生的情况是,通过隐式传递将查询推后到Teradata上,因此Teradata中的某些内容无法工作。您可能需要查询显式地将和转换为与其正在转换的内容不同的内容。

要确切地了解发生了什么,请使用OPTIONS SASTRACE;从文档中建议尝试

代码语言:javascript
复制
options sastrace=',,,d' sastraceloc=saslog nostsuffix;

尽管你可能需要在一些选项周围乱搞一下。这将显示在Teradata中执行的准确查询。在Teradata中直接尝试相同的查询,看看是否可以防止它出现相同的问题。

一旦发现了这一点,就可以使用显式传递执行正确的查询了。

代码语言:javascript
复制
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;
票数 5
EN

Stack Overflow用户

发布于 2013-07-26 10:05:15

在此类os情况下,一直是为Teradata中的val列定义的数据类型导致了“数字溢出”问题。(我假设val被定义为Integer类型,可以容纳+/-21亿)

尝尝这个,

代码语言:javascript
复制
proc sql;
  CREATE TABLE test AS 
    (SELECT
       YEAR(dt) AS yr,
       MONTH(dt) AS mo,
       SUM(cast(val as dec(32,0))) AS total
     FROM
       mydb1234.myTable
     WHERE
       myDate BETWEEN x AND y
     GROUP BY
       yr, mo);
QUIT;

在上面的代码中,SUM(cast(val as dec(32,0)))首先将val列转换为可以容纳几十亿的数据类型,然后进行求和。求和列total将是dec(32,0),而SAS更有能力处理这么大的数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17866807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档