数値をデータ型数値に変換する算術オーバーフローエラー


88

このクエリを実行するたびに、このエラーメッセージが表示され続けます。

Msg 8115, Level 16, State 8, Line 33
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.

しかし、作成テーブルを(7,0)に変更すると、エラーメッセージは表示されませんが、データを小数で表示する必要があります。私は8,3を試しましたが動作しません。

私がこれを行うのを手伝ってくれる人はいますか?どんな助けでも大歓迎です。

DECLARE @StartDate AS DATETIME
DECLARE @StartDate_y AS DATETIME
DECLARE @EndDate AS DATETIME
DECLARE @temp_y AS DATETIME

SET @temp_y = Dateadd(yy, Datediff(yy, 0, Getdate()), 0)
SET @StartDate_y = Dateadd(dd, 1 - Datepart(dw, Dateadd("ww", -2, @temp_y)),
                                      Dateadd("ww", -2, @temp_y))
SET @StartDate = Dateadd(dd, 1 - Datepart(dw, Dateadd("ww", -2, Getdate())),
                                  Dateadd("ww", -2, Getdate()))
SET @EndDate = Dateadd(dd, 6, @StartDate)

--temp table to hold all cities in list
CREATE TABLE ##temp
  (
     city VARCHAR(50)
  )

INSERT INTO ##temp
VALUES     ('ABERDEEN'),
            ('CHESAPEAKE'),
            ('Preffered-Seafood/CHICAGO'),
            ('Preffered-Redist/CHICAGO'),
            ('CLACKAMAS'),
            ('COLUMBUS'),
            ('CONKLIN'),
            ('DENVER'),
            ('FORT WORTH'),
            ('HANOVER PARK'),
            ('JACKSONVILLE'),
            ('LAKELAND'),
            ('MONTGOMERY'),
            ('PFW-NORTHEAST'),
            ('PFW-SOUTHEAST'),
            ('RIVERSIDE'),
            ('TRENTON,CANADA'),
            ('VERNON')

--temp to hold data for the cities
CREATE TABLE #temp
  (
     city            VARCHAR(50),
     ytdshipments    INT,
     ytdtotalweight  DECIMAL(7, 2) NOT NULL,
     ytdtotalcharges DECIMAL (7, 2) NOT NULL
  --YTDRevperPound decimal (7,2) not null
  )

INSERT INTO #temp
SELECT ##temp.city,
       0,
       0,
       0
FROM   ##temp

INSERT #temp
-- YTD shipments/Charges/Weight by city
SELECT city = CASE
                WHEN nameaddrmstr_1.city IN( 'ABERDEEN', 'CHESAPEAKE', 'CHICAGO'
                                             ,
                                             'CLACKAMAS',
                                             'COLUMBUS', 'CONKLIN', 'DENVER',
                                             'FORT WORTH',
                                             'HANOVER PARK', 'JACKSONVILLE',
                                             'LAKELAND'
                                             ,
                                             'MONTGOMERY'
                                                    ,
                                             'RIVERSIDE', 'TRENTON', 'VERNON' )
              THEN
                CASE
                  WHEN
              nameaddrmstr_1.city = 'CHICAGO'
              AND h.shipr = 'PREFRESVS' THEN 'Preffered-Redist/CHICAGO'
                WHEN
              nameaddrmstr_1.city = 'TRENTON'
              AND nameaddrmstr_1.city = 'CA' THEN 'TRENTON,CANADA'
                ELSE
              nameaddrmstr_1.city
                END
                ELSE 'Other'
              END,
       ytdshipments = COUNT(CONVERT(VARCHAR(10), h.dateshipped, 101)),
       ytdtotalweight =SUM(CASE
                             WHEN h.totaldimwgt > h.totalwgt THEN h.totaldimwgt
                             ELSE h.totalwgt
                           END),
       ytdtotalcharges = SUM (cs.totalestrevcharges)
--YTDRevperPound = convert(decimal(7,2),sum (cs.TotalEstRevCharges )/sum( CASE WHEN h.TotalDimWGT > > h.TotalWGT THEN h.TotalDimWGT ELSE h.TotalWGT END ))
FROM   as400.dbo.hawb AS h WITH(nolock)
       INNER JOIN as400.dbo.chargesummary AS cs
         ON h.hawbnum = cs.hawbnum
       LEFT OUTER JOIN as400.dbo.nameaddrmstr AS nameaddrmstr_1
         ON h.shipr = nameaddrmstr_1.nameaddrcode
WHERE  h.dateshipped >= '01/01/2010'
       AND h.dateshipped <= '12/19/2010'
       --WHERE H.DateShipped >= >= @StartDate_y AND H.dateshipped <= @EndDate 
       AND h.cust IN( 'DARDENREED', 'MAINEDARDE', 'MBMRIVRSDE', 'MBMCOLUMBS',
                      'MBMLAKELND', 'MBMFTWORTH', 'SYGMACOLUM', 'SYGMANETW6',
                      'MAI215', 'MBMMNTGMRY' )
GROUP  BY CASE
  WHEN nameaddrmstr_1.city IN( 'ABERDEEN', 'CHESAPEAKE', 'CHICAGO', 'CLACKAMAS',
                               'COLUMBUS', 'CONKLIN', 'DENVER', 'FORT WORTH',
                               'HANOVER PARK', 'JACKSONVILLE', 'LAKELAND',
                               'MONTGOMERY'
                                      ,
                               'RIVERSIDE', 'TRENTON', 'VERNON' ) THEN CASE
                                                                         WHEN
nameaddrmstr_1.city = 'CHICAGO'
AND h.shipr = 'PREFRESVS' THEN 'Preffered-Redist/CHICAGO'
                                                                         WHEN
nameaddrmstr_1.city = 'TRENTON'
AND nameaddrmstr_1.city = 'CA' THEN 'TRENTON,CANADA'
                                                                         ELSE
nameaddrmstr_1.city
                                                                       END
  ELSE 'Other'
END

SELECT #temp.city                 AS city,
       MAX(#temp.ytdshipments)    AS ytdshipments,
       MAX(#temp.ytdtotalweight)  AS ytdtotalweight,
       MAX(#temp.ytdtotalcharges) AS ytdtotalcharges
FROM   #temp WITH(nolock)
       LEFT OUTER JOIN ##temp
         ON ##temp.city = #temp.city
GROUP  BY #temp.city

DROP TABLE #temp

DROP TABLE ##temp  

9
私はそれを片付けるつもりさえありません
m.edmondson 2011年

3
私はあなたのSQLをここのオンラインフォーマッターを通してチャックしました。dpriver.com/pp/sqlformat.htmでも、手動で片付けることはできます。
マーティンスミス

3
フォーマッタのオプションが組み込まれていないのはなぜですか?
アドルフニンニク

6
Microsoft、聞いている場合は、エラーメッセージ「メッセージ8115、レベル16、状態8、行1の数値からデータ型数値への算術オーバーフローエラー」。変換できなかった元の値を示すことで改善できます。これは、1,000億行のテーブルをロードし、どの値が問題であるかを理解しようとするときに大いに役立ちます。SELECTの列番号を追加すると、同じように役立ちます。例えば。SELECT CAST(12345678910 as decimal(12,0))、CAST(12345678910 as decimal(12,2))...文字列: "値:12345678910列:2"をエラーメッセージに追加します。
wwmbes

回答:


206

私の推測では、99999.99より大きい数値を小数フィールドに押し込もうとしていると思います。それは99999.999より大きいかどう(8,3)にそれを変更すると、何もするつもりはない-あなたは、桁数を増やす必要が前に進。これを行うには、精度(小数点の前後の合計桁数)を上げます。保存する小数点以下の桁数を変更する必要がない限り、スケールは同じままにしておくことができます。試してみてくださいdecimal(9,2)またはdecimal(10,2)またはものは何でも。

コメントアウトしてこれをテストしinsert #temp、selectステートメントが提供する数値を確認し、それらが列で処理できる数よりも大きいかどうかを確認できます。


17
自動生成されたアカウントを持つ人々からの質問にわざわざ答えることはしません。彼らは自分たちがどこにいるのか理解しておらず、修正した後は戻ってきません。@ user572984:こんにちは!?誰か家?<タップ画面>いや、そうは思わなかった。
Ola Tuvesson 2013年

10進数のドットを外していたので大きくなりました。ありがとう!
ウェリントンロリンド2014

チェックはDatabase field lengthにするために等しいDataTableAdapterストアドプロシージャの特定のパラメータの長さ-その特定の列の長さ
Elshan

1
@OlaTuvesson、幸いなことに、User572984は長いものであり、おそらくこれを目にすることはないでしょうが、今日(2020年10月8日)の時点で、27万回以上視聴されています! したがって、UnknownUserに返済することで、27万人ものSOユーザーにメリットがあります。
ダン

83

このスレッドに出くわして間違った情報を入手した他の人(私の同僚など)にとって、1つの非常に重要なことを明確にする必要があると感じています。

与えられた答え(「decimal(9,2)またはdecimal(10,2)などを試してください。」)は正しいですが、理由(「10進数の前の桁数を増やす」)は間違っています。

decimal(p、s)とnumeric(p、s)はどちらも、精度とスケールを指定します。「精度」は、小数点の左側の桁数ではなく、数値の合計精度です。

例:decimal(2,1)は0.0から9.9をカバーします。これは、精度が2桁(00から99)で、スケールが1であるためです。decimal(4,1​​)は000.0から999.9をカバーします。decimal(4,2)は00.00から99.99 decimal(4,3)は0.000から9.999をカバーします


7
精度を高め、同じスケールを残すことによって、あなたはされている小数点の前の桁数を増やします。だから私が言ったことは間違っていませんが、それがどのように誤解される可能性があるかはわかります。OPはもともとスケールを大きくするだけで問題を解決しようとしていたので、そのように言いましたが、あなたは正しいです。向上させる必要があるのは全体の精度です。
adam0101 2015年

1

サイズをdecimal(9,2)からdecimal(7,2)に縮小する場合は、decimal(7,2)に収まるように、より大きな値を持つ既存のデータを考慮する必要があります。これらの数値を削除する必要があるか、新しいサイズに収まるように切り捨てます。更新しようとしているフィールドのデータがない場合は、問題なく自動的に更新されます


0

CAST関数とまったく同じ方法でTRY_CAST関数を使用します。TRY_CASTは文字列を受け取り、ASキーワードの後に​​指定されたデータ型にそれをキャストしようとします。変換が失敗した場合、TRY_CASTは失敗する代わりにNULLを返します。


1
TRY_CASTは式を取り、その値がキャストされます。あなたがそれを置くように文字列だけではありません。
TT。

これにより、ルーチンをエラーなしで完了することができますが、データが失われるという犠牲が伴います。エラーの目的は、データの欠落を防ぐために介入が必要であることを示すことです。あなたの解決策は、結果が存在するかどうかを本当に気にしない場合にのみ機能します。
ダン

-2

整数列に格納したい値を確認してください。これは整数の範囲よりも大きいと思います。整数範囲よりも大きい値を格納する場合。bigintデータ型を使用する必要があります


OPは、問題の列が整数ではなく数値であることを示し(「数値をデータ型数値に変換する算術オーバーフローエラー」というエラーメッセージで示されます)、上位に投稿された回答はこれに正しく対処しています。あなたの答えは問題を正しく識別しますが(結果を保存するための十分なスペースがありません)、質問の本来の意図を見逃しています。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.