SQL Server UNION ALL 結果 SUM函數造成精度丟失


使用場景:

       在進行多維度匯總數據時,需要將不同數據類型,不同數據精度的數據合並成一張表時,相關計算出現精度丟失問題。

 

問題排查:

       在進行分段排查后,找到丟失原因,SUM函數造成精度丟失

 

場景在現:

       1. 創建表

  CREATE TABLE A_TEST
  (
     ID_CODE NVARCHAR(10),
     VAR1 DECIMAL(17,0)  -- DECIMAL(17,0) 做為數量使用 小數位為0,※1 問題
  ) 
   
  CREATE TABLE B_TEST
  (
     ID_CODE NVARCHAR(10),
     VAR2 DECIMAL(19,4)  -- 帶小數位
  )

  CREATE TABLE C_TEST
  (
    ID_CODE NVARCHAR(10),
       VAR3 INT -- 整型 例證
  )

 

  2. 插入數據

  INSERT INTO A_TEST SELECT 'A001',17 ;

  INSERT INTO B_TEST SELECT 'B001',123.4567 ;

  INSERT INTO C_TEST SELECT 'C001',15 ;

 

  3. SQL各出力結果

  ①  出力 .0000

  select var1 from A_TEST -- DECIMAL(17,0)
    union all
  select var2 from B_TEST -- DECIMAL(19,4)

  

  

  ②  SUM 函數使用對 DECIMAL(17,0)的影響  出力 x 1

  select sum(var1) from A_TEST
    union all
  select var2 from B_TEST

  

 

  ③ SUM函數使用對 DECIMAL(19,4)的影響 出力 .0000

  select var1 from A_TEST
    union all
  select sum(var2) from B_TEST

  

 

  ④  INT 數據類型 出力  .0000

  -- C_TEST 使用
  select var3 from C_TEST
    union all
  select var2 from B_TEST

  

 

  ⑤  INT 數據類型 SUM函數使用對結果影響

  select sum(var3) from C_TEST
    union all
  select var2 from B_TEST

  

  ⑥  sum() count() avg() max() min()

  select 'sum',sum(15.12)
    union all
  select 'sum',14.2222

  select 'count',count(15.12)
    union all
  select 'count',14.2222

  select 'avg',avg(18.66)
    union all
  select 'avg',14.2222

  select 'max',max(18.66)
    union all
  select 'max',14.2222

  select 'min',min(18.66)
    union all
  select 'min',14.2222

  

 

  結果說明:

      通過上述①-⑤例子,可以看出只有在DECIMAL(17,0)數據類型下,使用了SUM函數,出力的結果才會發生預想外的改變 (預想 .0000 出力 實際 x1 出力)

      這里感覺DECIMAL(17,0)情況下sum 函數會自動將當前小數位截取掉,和其他類型不在做合並計算,不會產生多位,或者按最大位數展示出力結果

      而在union all 時,就按多SQL的最小精度出力,所以,當有SUM(DECIMAL(17,0))情況出現時,UNION ALL的結果集就是沒有小數位

      ⑥這個例子是除了sum() 函數以外union all的情況,可以看到AVG()函數是union all 的2條SQL文的精度和其余的都按照最大精度走

 

   ※ 這里暫時說明的是 SQL Server 之后會對比ORACLE MySQL 等基本數據庫 (這里注明之后補充案例,ORACLE中,SUM(NUMBER(7,0))在做UNION  ALL不會取到 x1這樣的出力結果 )

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM