PRB: Απώλεια ακρίβειας ενδέχεται να παρουσιαστεί κατά τη χρήση της SUM ή AVG λειτουργίες σε έναν τύπο με διαίρεση

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 281341 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Συμπτώματα

Όταν χρησιμοποιείτε τη συνάρτηση συγκεντρωτικών αποτελεσμάτων SUM ή AVG με διαίρεση, το αποτέλεσμα χάνει την ακρίβεια. Η απώλεια ακρίβειας παρουσιάζεται ανεξάρτητα από το αν χρησιμοποιούν έναν τύπο αριθμητικών ή δεκαδικών δεδομένων.

Αιτία

Αυτή η συμπεριφορά είναι λόγω για τη φύση του τύπους δεκαδική και αριθμητικών δεδομένων και την περικοπή που προκύπτει ως αποτέλεσμα της την ακρίβεια και κλίμακα τιμών. Σύμφωνα με SQL Server ηλεκτρονικά εγχειρίδια, το αποτέλεσμα της sum(numeric(p,s)) είναι numeric(38,s). Στην περίπτωση του προηγούμενου, sum(amount) είναι numeric(38,9). Όταν έχετε μια έκφραση numeric(38,9) / numeric(15,9), θεωρητικά, το αποτέλεσμα είναι numeric(63,25). Ωστόσο, επειδή η μέγιστη ακρίβεια 38, περικόπτει το αποτέλεσμα σε (38,6).

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιλύσετε αυτήν τη συμπεριφορά, χρησιμοποιήστε μία από τις εξής μεθόδους:
  • Χρησιμοποιήστε ένα αριθμητικό ως διαιρέτης. Για παράδειγμα:

    DECLARE @Quantity numeric(15,9)
    SET @Quantity = 3
    
    SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost
    FROM t1
    
    					
  • Αποθηκεύστε πρώτα το άθροισμα σε μια μεταβλητή και χρησιμοποιήστε τη μεταβλητή στον τύπο. Για παράδειγμα:

    
    declare @quantity numeric (15,9)
    set @quantity = 3
    
    declare @sum numeric (15,9)
    set @sum= (select sum(amount) from t1)
    select @sum/@quantity as cost
    
    					
  • Τοποθετήστε μια ρητή τιμή σε μια παρονομαστή. Για παράδειγμα:
    select sum(Amount)/3 from t1
    					

Περισσότερες πληροφορίες

Για να αναπαραγάγετε τη συμπεριφορά, εκτελέστε το παρακάτω ερώτημα από το Query Analyzer:
CREATE TABLE t1 
(
    Amount    numeric(15,9)    
)
GO
INSERT INTO t1( Amount ) VALUES (0.7)
INSERT INTO t1( Amount ) VALUES (1.3)
SELECT Amount FROM t1

/* result (correct, scale = 9)
Amount    
  
----------------- 
.700000000
1.300000000

DECLARE @Quantity numeric(15,9)
SET @Quantity = 3
    
SELECT t1.Amount / @Quantity As Cost
FROM t1
				
Και πάλι, την κλίμακα και την ακρίβεια είναι σωστά στο αποτέλεσμα.

Ωστόσο, εάν χρησιμοποιείτε αυτόν τον κωδικό

DECLARE @Quantity numeric(15,9)<BR/>
SET @Quantity = 3

SELECT Sum(t1.Amount)/@Quantity As Cost<BR/>
FROM t1
				
το αποτέλεσμα είναι.666666.

Η απώλεια ακρίβειας δεν προκύπτει, εάν δώσετε μια ρητή τιμή ως παρονομαστή. Απώλεια ακρίβειας δεν παρουσιάζεται εάν τοποθετήσετε στην τιμή του αθροίσματος:

select sum(Amount)/3 from t1
GO
select 2.0000000/@quantity

				
Δεν υπάρχει απώλεια ακρίβειας παρουσιάζεται εάν αποθηκεύσετε SUM(amount) σε μια μεταβλητή και στη συνέχεια, χρησιμοποιήστε τη μεταβλητή. Η απώλεια ακρίβειας προκύπτει μόνο όταν χρησιμοποιείτε τη λέξη συγκεντρωτικές κλειδί SUM ή AVG ενός μαθηματικού τύπου με διαίρεση.
declare @quantity numeric (15,9)
set @quantity = 3

declare @sum numeric (15,9)
set @sum= (select sum(amount) from t1)

select @sum/@quantity as cost
				

Ιδιότητες

Αναγν. άρθρου: 281341 - Τελευταία αναθεώρηση: Κυριακή, 19 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Λέξεις-κλειδιά: 
kbprb kbmt KB281341 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:281341

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com