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 に、合計値に対応できるフィールド長を使用してテーブルを作成させる方法はありますか? それらは数十億の範囲にあるので、それほど珍しいことではないと思います。皆さんがどう思っているか興味がありました。

4

3 に答える 3

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;
于 2013-07-25T19:50:42.313 に答える
1

ジョーが以前に指摘したように、この問題を引き起こした根本的な問題を調査します。ただし、根本的な問題を解決する簡単な回避策を見つけました。次の行を使用しましたSUM

Round((SUM(myField))/1) format=13. 
于 2013-07-25T21:29:02.023 に答える
0

このような状況ではval、「数値オーバーフロー」の問題を引き起こしているのは、Teradata テーブルの列に定義されているデータ型です。(最大 +/-21 億を保持できる型valとして定義されていると想定しています)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 はそのような大きな数を処理する能力を超えています。

于 2013-07-26T10:05:15.367 に答える