使用場景: 在進(jìn)行多維度匯總數(shù)據(jù)時(shí),,需要將不同數(shù)據(jù)類型,不同數(shù)據(jù)精度的數(shù)據(jù)合并成一張表時(shí),,相關(guān)計(jì)算出現(xiàn)精度丟失問題,。
問題排查: 在進(jìn)行分段排查后,,找到丟失原因,SUM函數(shù)造成精度丟失
場景在現(xiàn): 1. 創(chuàng)建表 CREATE TABLE A_TEST CREATE TABLE C_TEST
2. 插入數(shù)據(jù) INSERT INTO A_TEST SELECT 'A001',17 ; INSERT INTO B_TEST SELECT 'B001',123.4567 ; INSERT INTO C_TEST SELECT 'C001',15 ;
3. SQL各出力結(jié)果 ?、?nbsp; 出力 .0000 select var1 from A_TEST -- DECIMAL(17,0)
② SUM 函數(shù)使用對 DECIMAL(17,0)的影響 出力 x 1 select sum(var1) from A_TEST
?、?SUM函數(shù)使用對 DECIMAL(19,4)的影響 出力 .0000 select var1 from A_TEST
?、?nbsp; INT 數(shù)據(jù)類型 出力 .0000 -- C_TEST 使用
⑤ INT 數(shù)據(jù)類型 SUM函數(shù)使用對結(jié)果影響 select sum(var3) from C_TEST
?、?nbsp; sum() count() avg() max() min() select 'sum',sum(15.12) select 'count',count(15.12) select 'avg',avg(18.66) select 'max',max(18.66) select 'min',min(18.66)
結(jié)果說明: 通過上述①-⑤例子,,可以看出只有在DECIMAL(17,0)數(shù)據(jù)類型下,使用了SUM函數(shù),,出力的結(jié)果才會發(fā)生預(yù)想外的改變 (預(yù)想 .0000 出力 實(shí)際 x1 出力) 這里感覺DECIMAL(17,0)情況下sum 函數(shù)會自動將當(dāng)前小數(shù)位截取掉,和其他類型不在做合并計(jì)算,,不會產(chǎn)生多位,,或者按最大位數(shù)展示出力結(jié)果 而在union all 時(shí),就按多SQL的最小精度出力,,所以,,當(dāng)有SUM(DECIMAL(17,0))情況出現(xiàn)時(shí),UNION ALL的結(jié)果集就是沒有小數(shù)位 ⑥這個(gè)例子是除了sum() 函數(shù)以外union all的情況,,可以看到AVG()函數(shù)是union all 的2條SQL文的精度和其余的都按照最大精度走
※ 這里暫時(shí)說明的是 SQL Server 之后會對比ORACLE MySQL 等基本數(shù)據(jù)庫 (這里注明之后補(bǔ)充案例,,ORACLE中,SUM(NUMBER(7,0))在做UNION ALL不會取到 x1這樣的出力結(jié)果 )
|
|