Я работал с запросом SQL 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 против 108/10000 и т. Д.), Которые никогда не достигают суммы и вместо этого считаются нулями.
Есть ли способ заставить этот proc sql создать таблицу, используя длину поля, которая может поддерживать мои общие значения? Они находятся в миллиардном сотне миллиардов, поэтому я ничего не думаю об этом необычном. Мне было любопытно посмотреть, что вы, ребята, подумали.
Это не проблема SAS, я не думаю. SAS не даст вам переполнения; если вы не в таких безумных цифрах, что это не может быть сохранено неточно в 64 битах, так или иначе, что, безусловно, не так. Если вы создали несколько значащих цифр> 15 значащих цифр, это может привести к значительным потерям, но это не даст вам никаких указаний на это. – Joe
Как работает интерфейс с терадатой? Есть ли 'libname' на сервере teradata, или он проходит через или что-то еще? – Joe
Там есть библиотека, и я ссылаться на него, как это: 'ОТ mydb1234.myTable' Где mydb1234 является' libref' –