5

我正在使用 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;

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

ERROR: Teradata row not delivered (trget): Numeric overflow occurred during computation.

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

我决定将我要相加的数字相除:

SUM(val/1000) AS total

然而,这产生了意想不到的后果。总和小于我在 Excel 中所做的手动总和。当我向除数添加更多数量级时,总数会降低。我猜这是在消除它试图求和的较小值(例如 10/1000 与 108/10000 等),这些值永远不会达到总和,而是读为零。

有没有办法强制这个 proc sql 使用可以容纳我的总值的字段长度创建一个表?它们在十亿的范围内,所以我认为这没什么不寻常的。我很想知道你们是怎么想的。

4

3 回答 3

5

我怀疑正在发生的事情是查询通过隐式传递被推回 Teradata,因此 Teradata 中的某些内容不起作用。您可能需要查询将总和显式转换为其他东西,而不是它被转换为的东西。

要查看到底发生了什么,请使用OPTIONS SASTRACE;从文档中建议尝试

options sastrace=',,,d' sastraceloc=saslog nostsuffix;

尽管您可能需要考虑一些选项。这将显示在 Teradata 中执行的确切查询。直接在 Teradata 中尝试相同的查询,看看是否可以防止它出现相同的问题。

一旦你弄清楚了,你就可以使用显式传递来执行正确的查询;IE

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;
于 2013-07-25T19:50:42.313 回答
1

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

Round((SUM(myField))/1) format=13. 
于 2013-07-25T21:29:02.023 回答
0

val在这些操作系统情况下,导致“数字溢出”问题的始终是为 Teradata 表中的列定义的数据类型。(我假设val被定义为Integer可以容纳 +/-21 亿的类型)

尝试这个,

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 完全能够处理如此大的数字。

于 2013-07-26T10:05:15.367 回答