当前位置:   article > 正文

mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失

mysql union all sum

[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失

0 2020-08-03 18:00:30 SQL Server 数据类型

使用场景:

在进行多维度汇总数据时,需要将不同数据类型,不同数据精度的数据合并成一张表时,相关计算出现精度丢失问题。

问题排查:

在进行分段排查后,找到丢失原因,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)

bc91bb04e6e9c61e24c974e4440db8f2.gif

②  SUM 函数使用对 DECIMAL(17,0)的影响  出力 x 1

select sum(var1) from A_TEST

union all

select var2 from B_TEST

bc91bb04e6e9c61e24c974e4440db8f2.gif

③ SUM函数使用对 DECIMAL(19,4)的影响 出力 .0000

select var1 from A_TEST

union all

select sum(var2) from B_TEST

bc91bb04e6e9c61e24c974e4440db8f2.gif

④  INT 数据类型 出力  .0000

-- C_TEST 使用

select var3 from C_TEST

union all

select var2 from B_TEST

bc91bb04e6e9c61e24c974e4440db8f2.gif

⑤  INT 数据类型 SUM函数使用对结果影响

select sum(var3) from C_TEST

union all

select var2 from B_TEST

bc91bb04e6e9c61e24c974e4440db8f2.gif

⑥  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

bc91bb04e6e9c61e24c974e4440db8f2.gif

结果说明:

通过上述①-⑤例子,可以看出只有在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这样的出力结果 )

本文网址:http://www.shaoqun.com/a/463890.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

sql

0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/554606
推荐阅读