2011-01-12 102 views
55

me siguen dando este mensaje de error cada vez que ejecuta esta consulta:error de desbordamiento aritmético al convertir numérico para el tipo de datos numéricos

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 de la mesa a crear (7,0), no lo entiendo 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 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 
+5

yo ni siquiera voy a empezar a poner en orden hasta que –

+2

me tiraron su SQL a través del formateador en línea aquí. http://www.dpriver.com/pp/sqlformat.htm Todavía podría hacer con una ordenación manual sin embargo. –

+1

¿Por qué la opción de formateador no está incorporada? –

Respuesta

138

Supongo que está tratando de exprimir un número mayor que 99999.99 en sus campos decimales. Si lo cambia a (8,3) no va a hacer nada si es superior a 99.999,999 - es necesario aumentar el número de dígitos antes del punto 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 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.

+2

Lo tengo para trabajar con (11,2). Gracias por tu ayuda. – user572984

+24

@ user572984 ¿por qué no marcar esto como la respuesta! – Shiham

+12

No me molestaría en responder preguntas de personas con cuentas generadas automáticamente; ellos no entienden dónde están y no vuelven una vez que han tenido su solución. @ user572984: ¡HOLA !? ¿ALGUIEN EN CASA? * * No, no lo creo. –

-1

Si desea reducir el tamaño de decimal (7,2) de decimal (9,2) tendrá que dar cuenta de los datos existentes con valores mayores para encajar 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

49

Creo que necesito aclarar algo muy importante, para otros (como mi compañero de trabajo) que encontraron este hilo y obtuvo la información incorrecta.

La respuesta dada ("Intentar decimal (9,2) o decimal (10,2) o lo que sea.") Es correcta, pero el motivo ("aumentar el número de dígitos antes del decimal") es incorrecto.

decimal (p, s) y numérico (p, s) especifica tanto a Precision and a Scale. 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 0,0 a 9,9, debido a que la precisión es de 2 dígitos (00 a 99) y la escala es 1. decimal (4,1) cubre 000,0-999,9 decimal (4,2) cubre el 99,99 00.00 a decimal (4,3) cubre 0.000 a 9.999

+4

Aumentando la precisión y dejando la escala igual, se aumenta el número de dígitos antes del decimal. Entonces, lo que dije no está mal, pero sí veo cómo podría malinterpretarse. Lo dije de esa manera porque originalmente el OP intentaba solucionar el problema simplemente aumentando la escala, pero estás en lo correcto; es la precisión total que necesita aumentarse. – adam0101

+1

Actualicé mi respuesta para reflejar esto. – adam0101

Cuestiones relacionadas