2013-07-25 63 views
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創建一個表使用一個字段長度,可以容納我的總價值?他們在億億美元的範圍內,所以沒有什麼不同尋常的想法。我很想知道你們的想法。

+0

這不是SAS特定的問題,我不這麼認爲。 SAS不會給你一個溢出;除非你處在這樣瘋狂的數字中,無法用64位不精確地存儲它,反正當然不是這樣。如果您生成了大於等於15位的有效數字,它可能開始削弱重要性,但它不會告訴您它正在這樣做。 – Joe

+0

與Teradata的接口如何在這裏工作?是否有一個'libname'到teradata服務器,或者它是否通過,或者其他? – Joe

+0

有一個圖書館,我像這樣引用它: 'FROM mydb1234.myTable' 凡mydb1234是'libref' –

回答

1

我要調查導致此問題的潛在問題,正如Joe指出的那樣。但是,我找到了解決根本問題的快速解決方法。我用下面的線爲我SUM

Round((SUM(myField))/1) format=13. 
5

我懷疑發生了什麼事情是通過隱式傳遞將查詢推回到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; 
+0

這是有道理的,我會試試看,謝謝! –

0

在這些類型的操作系統情況下,它始終是已在您的Teradata表的列val是造成了「數字溢出」的問題定義的數據類型。 (我假設val被定義爲可容納高達+/- 2.1billion Integer型)

嘗試此,

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能夠處理如此大的數字。

+0

我不認爲這會在SAS中編譯,因爲cast不是SAS函數,對嗎?它將以明確的透傳方式工作。 – Joe

+0

如果您將SQL作爲傳遞(利用數據庫處理)執行到Teradata,則此答案中的SQL將直接在Teradata上運行。 –

+0

當然,但上面的答案並沒有這樣做。 :)大部分'利用數據庫處理'的時間並不是很重要,因爲無論如何,SAS主要是這樣做的(將SAS代碼轉換爲數據庫內處理);畢竟這裏首先是讓我們陷入困境的原因。 – Joe