【发布时间】:2013-07-25 20:45:24
【问题描述】:
我正在使用 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 使用可以容纳我的总值的字段长度创建一个表?它们在十亿的范围内,所以我认为这没什么不寻常的。我很想知道你们的想法。
【问题讨论】:
-
我不认为这不是 SAS 特定问题。 SAS 不会给你溢出;除非你的数字如此疯狂,以至于它不能不精确地存储在 64 位中,无论如何,情况肯定不是这样。如果您生成了超过 15 个有效数字,它可能会开始删除重要性,但它不会给您任何迹象表明它正在这样做。
-
teradata 的接口在这里如何工作?是否有
libname到 teradata 服务器,或者它是通过,还是其他什么? -
有一个库,我这样引用它:
FROM mydb1234.myTable其中 mydb1234 是libref -
每年总计数千亿,并没有什么特别大的。
-
请显示使用的 LIBNAME 语句;有各种特定于 Teradata 的选项可能会有所帮助。