sql - Error de desbordamiento aritmético al convertir numérico a tipo de datos numérico
error de desbordamiento aritmético al convertir identity al tipo de datos tinyint (3)
Sigo recibiendo este mensaje de error cada vez que ejecuto esta consulta:
Msg 8115, Level 16, State 8, Line 33
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.
Pero si cambio la tabla de creación a (7,0), no obtengo el mensaje de error. Pero necesito que mis datos se muestren como un decimal. He intentado 8,3 no funciona.
¿Hay alguien que pueda ayudarme a trabajar en esto? Cualquier ayuda será muy apreciada.
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
Si desea reducir el tamaño a decimal (7,2) de decimal (9,2) tendrá que dar cuenta de los datos existentes con valores mayores para caber en decimal (7,2). O bien, tendrá que eliminar esos números truncarlos para que quepan en su nuevo tamaño. Si no hubo datos para el campo que está tratando de actualizar, lo hará automáticamente sin problemas
Siento que necesito aclarar algo muy importante, para otros (como mi compañero de trabajo) que encontraron este hilo y obtuvieron la información incorrecta.
La respuesta dada ("Intentar decimal (9,2) o decimal (10,2) o lo que sea") es correcta, pero la razón ("aumentar el número de dígitos antes del decimal") es incorrecta.
decimal (p, s) y numérico (p, s) ambos especifican una Precisión y una Escala . La "precisión" no es la cantidad de dígitos a la izquierda del decimal, sino la precisión total del número.
Por ejemplo: decimal (2,1) cubre de 0.0 a 9.9, porque la precisión es de 2 dígitos (00 a 99) y la escala es 1. decimal (4,1) abarca de 000.0 a 999.9 decimal (4,2) cubre 00.00 a 99.99 decimal (4,3) cubre 0.000 a 9.999
Supongo que estás tratando de exprimir un número mayor que 99999.99 en tus campos decimales. Cambiarlo a (8,3) no va a hacer nada si es mayor que 99999.999 - necesita aumentar el número de dígitos antes del decimal. Puede hacer esto aumentando la precisión (que es el número total de dígitos antes y después del decimal). Puede dejar la escala igual a menos que necesite modificar la cantidad de decimales que desea almacenar. Pruebe con decimal(9,2)
o decimal(10,2)
o lo que sea.
Puede probar esto comentando el insert #temp
y vea qué números le está dando la instrucción select y vea si son más grandes de lo que su columna puede manejar.