2013-08-26 7 views
5

जब मैं इस एसक्यूएल निष्पादितMSSQL - सभी विभिन्न दशमलव परिशुद्धता के साथ संघ

SELECT 1.4 UNION ALL 
SELECT 2.0400 union all 
SELECT 1.24 

मैं निम्नलिखित परिणाम प्राप्त:

1,4000
2,0400
1,2400

लेकिन जब मैं निम्नलिखित SQL

निष्पादित करें

मैं करने के निम्न परिणाम:

1,4
2,0
1,2

क्यों क्या परिशुद्धता (पैमाने) में एक फर्क है सभी रिकॉर्ड के लिए लागू किया जाता है? क्या यह हमेशा सटीकता का उपयोग नहीं करना चाहिए जहां कोई डेटा नुकसान नहीं होता है, बस 1 वर्ग की तरह?

Thx।

उत्तर

0

एक ही परिणाम के लिए यह प्रयास,

SELECT Cast(Sum(1.4) As Numeric(18,4)) UNION ALL 
SELECT Cast(Sum(2.0400) As Numeric(18,4)) union all 
SELECT Cast(Sum(1.24) As Numeric(18,4)) 
0

प्रयास करें इस

SELECT sum(1.4)/1.0 UNION ALL 
SELECT sum(2.0400)/1.0 union all 
SELECT sum(1.24)/1.0 

या

SELECT sum(1.4)/1.0 UNION ALL 
SELECT sum(2.0400) union all 
SELECT sum(1.24) 
0

सामान्य क्वेरी स्ट्रिंग मान गुजर अन्यथा राशि का उपयोग कर या इसे दशमलव में स्ट्रिंग निर्दिष्ट करने के लिए कनवर्ट है यह प्रारूप वास्तव में

SELECT sum(convert(decimal,1.4,3)) UNION ALL 
SELECT sum(2.0400) union all 
SELECT sum(1.24) 
0

इस क्वेरी का प्रयास करें

SELECT convert(decimal(18,4),Sum(1.4)) UNION ALL 

SELECT convert(decimal(18,4),Sum(2.0400)) UNION ALL 

SELECT convert(decimal(18,4),Sum(1.24)) 
3

मुझे पता है कि यह काफी एक पुराने सवाल है, लेकिन मौजूदा जवाब में से कोई भी पता करने के लिए लग रहे हैं "क्यों?" आपके प्रश्न के पहलू।

सबसे पहले, आपके शाब्दिक अभिव्यक्तियों के लिए डेटा प्रकार क्या है? मुझे यकीन है कि नहीं था (और यह देखने के लिए ऊपर नहीं था) तो मैं निम्नलिखित भाग गया:

select 1.4 union all 
select 'frob' 

जो त्रुटि देता है:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

ठीक है, तो 1.4 और अन्य शाब्दिक numeric कर रहे हैं - उर्फ decimal

इसके बाद, क्या SUM समारोह की वापसी प्रकार, है पारित कर दिया है, तो एक decimal(p,s) :

decimal(38, s)

ठीक है, तो आपकी क्वेरी में 3 SUM भाव का डेटा प्रकार के होते हैं decimal(38,1), decimal(38,4) और decimal(38,2)differing precisions and scales के नियमों के आधार पर, decimal(38,1) से चुनने के लिए उपलब्ध उन 3 डेटा प्रकारों को अंतिम चुना गया प्रकार दिया गया है।

The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.

तो, अंत में, पीठ decimal पर दस्तावेजीकरण करने के लिए:

By default, SQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. However, if the SET ARITHABORT option is ON, SQL Server raises an error when overflow occurs. Loss of only precision and scale is not sufficient to raise an error.

ताकि अपने अंतिम परिणाम है।


पहले इस प्रकार पर आश्चर्यजनक लग सकते हैं, जब तक आप महसूस करते हैं कि आम तौर पर, sum कई पंक्तियों के खिलाफ काम करेगा और यह आसानी से अपने स्वयं के डेटा प्रकार से ऊपर जाने का एक दिया परिशुद्धता और बड़े पैमाने की एक से अधिक मान के लिए संभव है। decimal(38,s) किसी भी परिशुद्धता को खोए बिना किसी भी अतिप्रवाह को समायोजित करने के लिए सबसे बड़ा संभव स्थान देता है, विशेषSUM() घटना के लिए, और इसका मतलब है कि क्वेरी के निष्पादित होने से पहले अंतिम डेटा प्रकार का निर्णय लिया जा सकता है।

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