算术溢出错误将数字转换为数据types数字

我每次运行这个查询时都会收到这个错误消息:

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

但是,如果我将创build表更改为(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 

我的猜测是,你正试图把一个大于99999.99的数字压缩到你的十进制字段中。 如果它大于99999.999,则将其更改为(8,3)不会执行任何操作 – 您需要增加小数点的位数。 你可以通过提高精度(这是十进制前后的总位数)来做到这一点。 除非需要更改要存储的小数位数,否则可以保持一致。 尝试decimal(9,2)decimal(10,2)或其他。

你可以通过注释insert #temp来testinginsert #temp ,看看select语句给你什么数字,看它们是否比你的列可以处理的大。

我觉得我需要澄清一件非常重要的事情,对于碰到这个线索并得到错误信息的其他人(比如我的同事)。

给出的答案(“尝试十进制(9,2)或十进制(10,2)或任何”)是正确的,但原因(“增加小数点前的位数”)是错误的。

十进制(p,s)和数字(p,s)都指定了Precision和Scale 。 “精度”不是小数点左边的位数,而是数字的总精度。

例如:小数点(2,1)涵盖0.0到9.9,因为精度是2位数(00到99),比例是1.小数(4,1)覆盖000.0到999.9小数(4,2)覆盖00.00到十进制99.99(4,3)包含0.000到9.999

如果你想从十进制(9,2)减小到十进制(7,2)的大小,你将不得不考虑现有数据的值大于十进制(7,2)。 要么你将不得不删除这些数字是截断它,以适应你的新的大小。 如果没有关于您正在更新的字段的数据,则会自动执行而没有问题