日期:2014-05-18  浏览次数:20512 次

sql汇总查询的问题{浮点数据运算}
请教问题:
我有两个表,
表1:tel_info包含了部门,电话号码,等字段,一个部门可以有多个电话号码
表2:tel_feiyong,包含了电话号码,时间,通话费,信息费,XX费
我想通过汇总查询两个表,得到如下数据:
部门,电话,电话费汇总,信息费汇总,XX费汇总




可是我在查询的过程中,老是出现汇总出来的数据不正确的情况,请问大家如何解决

汇总字段是FLOAT(menoy 也试了)


SELECT tel_info.外线号码, tel_info.部门, Sum(tel_feiyong.基本通话费) AS 基本通话费之总计
FROM tel_info INNER JOIN tel_feiyong ON tel_info.外线号码 = tel_feiyong.电话号码
GROUP BY tel_info.外线号码, tel_info.部门;


最后得到的基本通话费之总计是很多小数位的数据
用ROUND四舍后,数据还是不准确.
不知如何解决

------解决方案--------------------
浮点数据是近似数据,无法做到绝对的准确.
SQL code
float 和 real
用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。

语法
float [ ( n ) ]

从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

n 所在范围 精度 存储大小 
1-24 7 位数 4 字节 
25-53 15 位数 8 字节 


Microsoft® SQL Server? float[(n)] 数据类型对于从 1 到 53 之间的所有 n 值均符合 SQL-92 标准。double precision 的同义词为 float(53)。

real

从 ?3.40E + 38 到 3.40E + 38 之间的浮点数字数据。存储大小为 4 字节。在 SQL Server 中,real 的同义词为 float(24)。

------解决方案--------------------
没数据没真相,按道理你的写法是正确的
------解决方案--------------------
用decimal数据类型:
SQL code
create table tel_feiyong(电话号码 varchar(20),基本通话费 decimal(18,2),信息费 decimal(18,2),XX费 decimal(18,2))
create table tel_info(部门 nvarchar(10),外线号码 varchar(20))
insert into tel_info select 'AA','12345678'
insert into tel_feiyong select '12345678',23.45,0.40,10.02
insert into tel_feiyong select '12345678',11.02,0.50,2.46
insert into tel_feiyong select '12345678',20.11,0.30,5.93
go
SELECT tel_info.外线号码, tel_info.部门, Sum(tel_feiyong.基本通话费) AS 基本通话费之总计
FROM tel_info INNER JOIN tel_feiyong ON tel_info.外线号码 = tel_feiyong.电话号码
GROUP BY tel_info.外线号码, tel_info.部门
go
drop table tel_feiyong,tel_info
/*
外线号码                 部门         基本通话费之总计
-------------------- ---------- ---------------------------------------
12345678             AA         54.58

(1 行受影响)

*/

------解决方案--------------------
decimal(18,2)