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 = 3SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As CostFROM t1					
  • تخزين المجموع في متغير أولاً ثم استخدم المتغير في الصيغة. على سبيل المثال:

    declare @quantity numeric (15,9)set @quantity = 3declare @sum numeric (15,9)set @sum= (select sum(amount) from t1)select @sum/@quantity as cost					
  • وضع قيمة واضحة في مقام. على سبيل المثال:
    select sum(Amount)/3 from t1					
معلومات أخرى
لإنتاج السلوك تشغيل الاستعلام التالي من "استعلام محلل":
CREATE TABLE t1 (    Amount    numeric(15,9)    )GOINSERT INTO t1( Amount ) VALUES (0.7)INSERT INTO t1( Amount ) VALUES (1.3)SELECT Amount FROM t1/* result (correct, scale = 9)Amount      ----------------- .7000000001.300000000DECLARE @Quantity numeric(15,9)SET @Quantity = 3    SELECT t1.Amount / @Quantity As CostFROM t1				
Again ، مقياس والدقة صحة في الناتج.

ومع ذلك، إذا استخدمت هذه التعليمة البرمجية
DECLARE @Quantity numeric(15,9)<BR/>SET @Quantity = 3SELECT Sum(t1.Amount)/@Quantity As Cost<BR/>FROM t1				
.666666 تكون النتيجة.

لا يحدث فقدان الدقة إذا قمت بتوفير قيمة واضحة العدد الصحيح المستخدم في مقام. لا يحدث فقدان الدقة إذا قمت بوضع في قيمة المجموع:
select sum(Amount)/3 from t1GOselect 2.0000000/@quantity				
يحدث فقدان لا من الدقة إذا بتخزين SUM(amount) في متغير ثم استخدم المتغير. يحدث فقدان الدقة فقط عند استخدام أساسية التجميعية SUM أو AVG في صيغة رياضية مع القسمة.
declare @quantity numeric (15,9)set @quantity = 3declare @sum numeric (15,9)set @sum= (select sum(amount) from t1)select @sum/@quantity as cost				
قسمة اقتطاع AVG SUM الدقة

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 281341 - آخر مراجعة: 12/05/2015 23:03:30 - المراجعة: 3.2

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbmt kbprb KB281341 KbMtar
تعليقات