2011-01-12 15 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

मेरा अनुमान है कि आप अपने दशमलव फ़ील्ड में 99 999.99 से अधिक संख्या को निचोड़ने का प्रयास कर रहे हैं। इसे बदलने के लिए (8,3) कुछ भी नहीं करने जा रहा है यदि यह 99 999.9 99 से अधिक है - तो आपको अंकों की संख्या दशमलव से पहले बढ़ाने की आवश्यकता है। आप परिशुद्धता को बढ़ाकर ऐसा कर सकते हैं (जो दशमलव से पहले और बाद में अंकों की कुल संख्या है)। आप स्केल को तब तक छोड़ सकते हैं जब तक आपको स्टोर करने के लिए कितने दशमलव स्थान बदलने की आवश्यकता न हो। decimal(9,2) या decimal(10,2) या जो कुछ भी आजमाएं।

आप insert #temp पर टिप्पणी करके इसका परीक्षण कर सकते हैं और देख सकते हैं कि कौन सा चयन स्टेटमेंट आपको दे रहा है और देख सकता है कि वे आपके कॉलम से बड़े हैं या नहीं।

+2

मुझे इसे काम करने के लिए मिला (11,2)। आपकी सहायता के लिए धन्यवाद. – user572984

+24

@ user572984 तो इसे उत्तर के रूप में क्यों चिह्नित न करें! – Shiham

+12

मैं ऑटो-जेनरेट किए गए खातों वाले लोगों के प्रश्नों का उत्तर देने से परेशान नहीं होगा; वे नहीं समझते कि वे कहां हैं और वे ठीक होने के बाद वापस नहीं आते हैं। @ उपयोगकर्ता 572 9 4: हेल्लो !? कोई घर पर है? * * नहीं, ऐसा नहीं सोचा था। –

-1

यदि आप दशमलव (9,2) से दशमलव को दशमलव (7,2) से कम करना चाहते हैं तो आपको दशमलव डेटा (7,2) में फिट होने के लिए मौजूदा डेटा के साथ मौजूदा डेटा के लिए खाते होंगे। या तो आपको उन नंबरों को हटाना होगा जो इसे आपके नए आकार में फिट करने के लिए कम कर देते हैं। यदि फ़ील्ड के लिए कोई डेटा नहीं था, तो आप इसे अपडेट करने का प्रयास कर रहे हैं, यह बिना किसी समस्या के स्वचालित रूप से करेगा

49

मुझे लगता है कि मुझे इस धागे में आने वाले अन्य लोगों (जैसे मेरे सहकर्मी) के लिए एक बहुत ही महत्वपूर्ण बात स्पष्ट करने की आवश्यकता है। गलत जानकारी मिली

उत्तर दिया गया ("दशमलव (9,2) या दशमलव (10,2) या जो भी हो।") सही है, लेकिन कारण ("दशमलव से पहले अंकों की संख्या में वृद्धि") गलत है।

दशमलव (पी, एस) और न्यूमेरिक (पी, एस) दोनों a Precision and a Scale निर्दिष्ट करते हैं। "परिशुद्धता" दशमलव के बाईं ओर अंकों की संख्या नहीं है, बल्कि इसके बजाय संख्या की कुल सटीकता है।

उदाहरण के लिए: दशमलव (2,1) 9.9 को 0.0 को शामिल किया गया है, क्योंकि परिशुद्धता 2 अंक (99 करने के लिए 00) है और बड़े पैमाने 1. दशमलव (4,1) ०००.० को 999.9 दशमलव (को शामिल किया गया है 4,2) 00.00 से 99.99 दशमलव (4,3) कवर 0.000 से 9.9 99

+4

परिशुद्धता बढ़ाने और स्केल को छोड़कर, आप दशमलव से पहले अंकों की संख्या में वृद्धि कर रहे हैं। तो मैंने जो कहा वह गलत नहीं है, लेकिन मैं देखता हूं कि इसे गलत समझा जा सकता है। मैंने ऐसा इसलिए कहा क्योंकि ओपी मूल रूप से पैमाने को बढ़ाकर समस्या को ठीक करने की कोशिश कर रहा था, लेकिन आप सही हैं; यह कुल परिशुद्धता है जिसे बढ़ाने की जरूरत है। – adam0101

+1

मैंने इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट किया। – adam0101

संबंधित मुद्दे