mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
[數(shù)據(jù)庫]SQL Server UNION ALL 結(jié)果 SUM函數(shù)造成精度丟失
0 2020-08-03 18:00:30 SQL Server 數(shù)據(jù)類型
使用場景:
在進(jìn)行多維度匯總數(shù)據(jù)時,需要將不同數(shù)據(jù)類型,不同數(shù)據(jù)精度的數(shù)據(jù)合并成一張表時,相關(guān)計算出現(xiàn)精度丟失問題。
問題排查:
在進(jìn)行分段排查后,找到丟失原因,SUM函數(shù)造成精度丟失
場景在現(xiàn):
1. 創(chuàng)建表
CREATE TABLE A_TEST
(
ID_CODE NVARCHAR(10),
VAR1 DECIMAL(17,0)? -- DECIMAL(17,0) 做為數(shù)量使用 小數(shù)位為0,※1 問題
)
CREATE TABLE B_TEST
(
ID_CODE NVARCHAR(10),
VAR2 DECIMAL(19,4)? -- 帶小數(shù)位
)
CREATE TABLE C_TEST
(
ID_CODE NVARCHAR(10),
VAR3 INT -- 整型 例證
)
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é)果
①? 出力 .0000
select var1 from A_TEST -- DECIMAL(17,0)
union all
select var2 from B_TEST -- DECIMAL(19,4)
②? SUM 函數(shù)使用對 DECIMAL(17,0)的影響 ?出力 x 1
select sum(var1) from A_TEST
union all
select var2 from B_TEST
③ SUM函數(shù)使用對 DECIMAL(19,4)的影響 出力 .0000
select var1 from A_TEST
union all
select sum(var2) from B_TEST
④? INT 數(shù)據(jù)類型 出力? .0000
-- C_TEST 使用
select var3 from C_TEST
union all
select var2 from B_TEST
⑤? INT 數(shù)據(jù)類型 SUM函數(shù)使用對結(jié)果影響
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
結(jié)果說明:
通過上述①-⑤例子,可以看出只有在DECIMAL(17,0)數(shù)據(jù)類型下,使用了SUM函數(shù),出力的結(jié)果才會發(fā)生預(yù)想外的改變 (預(yù)想 .0000 出力 實際 x1 出力)
這里感覺DECIMAL(17,0)情況下sum 函數(shù)會自動將當(dāng)前小數(shù)位截取掉,和其他類型不在做合并計算,不會產(chǎn)生多位,或者按最大位數(shù)展示出力結(jié)果
而在union all 時,就按多SQL的最小精度出力,所以,當(dāng)有SUM(DECIMAL(17,0))情況出現(xiàn)時,UNION ALL的結(jié)果集就是沒有小數(shù)位
⑥這個例子是除了sum() 函數(shù)以外union all的情況,可以看到AVG()函數(shù)是union all 的2條SQL文的精度和其余的都按照最大精度走
※ 這里暫時說明的是 SQL Server 之后會對比ORACLE MySQL 等基本數(shù)據(jù)庫 (這里注明之后補充案例,ORACLE中,SUM(NUMBER(7,0))在做UNION? ALL不會取到 x1這樣的出力結(jié)果?)
本文網(wǎng)址:http://www.shaoqun.com/a/463890.html
*特別聲明:以上內(nèi)容來自于網(wǎng)絡(luò)收集,著作權(quán)屬原作者所有,如有侵權(quán),請聯(lián)系我們:admin@shaoqun.com。
sql
0
總結(jié)
以上是生活随笔為你收集整理的mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信如何开通信用卡收款
- 下一篇: 随时现金放款审核中要多久到账