我正在使用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使用可以容纳我的总值的字段长度创建一个表?它们的数量在十亿 - 千亿之间,所以我认为这并不奇怪.我很想知道你们的想法.
我怀疑发生了什么是通过隐式传递将查询推回到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)
正如乔之前指出的那样,我将调查导致此问题的根本问题。但是,我找到了解决根本问题的快速解决方法。我使用了以下行SUM
Round((SUM(myField))/1) format=13.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2080 次 |
| 最近记录: |