我正在处理一个SAS proc查询,发现了一些奇怪的东西。首先,我尝试了以下简单的查询:
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 vs 108/10000等)永远达不到和,而是被读为零。
是否有一种方法可以强制这个proc使用一个字段长度来创建一个表,该字段长度可以容纳我的总价值?它们在十亿到千亿的范围内,所以我认为没有什么不寻常的。我很想看看你们怎么想的。
发布于 2013-07-25 21:29:02
正如Joe前面所指出的,我将调查导致这一问题的潜在问题。然而,我找到了一个解决根本问题的快速解决办法。我在我的SUM中使用了以下一行
Round((SUM(myField))/1) format=13. 发布于 2013-07-25 19:50:42
我怀疑正在发生的情况是,通过隐式传递将查询推后到Teradata上,因此Teradata中的某些内容无法工作。您可能需要查询显式地将和转换为与其正在转换的内容不同的内容。
要确切地了解发生了什么,请使用OPTIONS SASTRACE;从文档中建议尝试
options sastrace=',,,d' sastraceloc=saslog nostsuffix;尽管你可能需要在一些选项周围乱搞一下。这将显示在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;发布于 2013-07-26 10:05:15
在此类os情况下,一直是为Teradata中的val列定义的数据类型导致了“数字溢出”问题。(我假设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更有能力处理这么大的数字。
https://stackoverflow.com/questions/17866807
复制相似问题