2011-01-12 2 views
55

я получаю сообщение об ошибке каждый раз, когда я запускаю этот запрос:Ошибка арифметического переполнения преобразования числовой к типу данных цифровой

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 
+5

Я даже не собираюсь начинать убирать это вверх –

+2

Я выбросил ваш SQL через онлайн-форматирование здесь. http://www.dpriver.com/pp/sqlformat.htm Могло бы все же сделать с ручным приложением. –

+1

Почему нет возможности встроенного форматирования? –

ответ

138

Я предполагаю, что вы пытаетесь сжать число, большее чем 99999,99, в ваши десятичные поля. Изменение его на (8,3) не собирается делать ничего, если оно больше 99999.999 - вам нужно увеличить число цифр до десятичного числа. Вы можете сделать это, увеличив точность (это общее количество цифр до и после десятичного числа). Вы можете оставить шкалу одинаковой, если вам не нужно изменить количество десятичных знаков для хранения. Попробуйте decimal(9,2) или decimal(10,2) или что угодно.

Вы можете проверить это, комментируя insert #temp и посмотреть, какие цифры выдает оператор select, и посмотреть, больше ли они, чем может обрабатывать ваш столбец.

+2

Я получил его для работы с (11,2). Спасибо за вашу помощь. – user572984

+24

@ user572984 так почему бы не отметить это как ответ! – Shiham

+12

Я бы не стал отвечать на вопросы людей с автогенерированными учетными записями; они не понимают, где они находятся, и они не возвращаются, как только у них есть свои проблемы. @ user572984: HELLO !? ЛЮБОЙ ДОМ? * * Нет, не думаю. –

-1

Если вы хотите уменьшить размер до десятичной (7,2) из ​​десятичной (9,2), вам придется учитывать существующие данные со значениями больше, чтобы они вписывались в десятичные числа (7,2). Либо вам придется удалить эти числа, усекайте его, чтобы вписаться в новый размер. Если не было данных для поля, которое вы пытаетесь обновить, оно будет делать это автоматически без проблем.

49

Я чувствую, что мне нужно прояснить одну очень важную вещь, для других (например, моего коллеги), которые столкнулись с этой нитью и получил неверную информацию.

Ответ на этот вопрос («Попробуйте десятичное (9,2) или десятичное (10,2) или что-то еще») правильно, но причина («увеличение числа цифр до десятичного числа») неверна.

decimal (p, s) и числовые (p, s) оба указывают a Precision and a Scale. «Точность» - это не количество цифр слева от десятичной, а вместо этого полная точность числа.

Например: десятичной (2,1) охватывает от 0,0 до 9,9, так как точность 2 цифры (от 00 до 99) и масштаб 1. десятичной (4,1) охватывает 000,0 до 999,9 десятичной (4,2) охватывает 00.00 до 99.99 decimal (4,3) охватывает от 0.000 до 9.999

+4

Увеличивая точность и оставляя масштаб таким же, вы увеличиваете число цифр до десятичного знака. Так что я сказал не так, но я вижу, как это можно понять неправильно. Я так сказал, потому что ОП изначально пытался исправить проблему, просто увеличив масштаб, но вы правы; это полная точность, которую нужно увеличить. – adam0101

+1

Я обновил свой ответ, чтобы отразить это. – adam0101

Смежные вопросы

 Смежные вопросы