(非常奇怪)关于在sql语句里面进行分组汇总计算的问题

eastfar 2010-11-23 10:19:12
就是下面这条sql语句,主要功能是进行分组数量价格的汇总,再进行计算
已经能确定分组的第一条数据为5302.75000,10398.55000,10702.550
但是如果按如下的语句来运行的话sum(m.qty * m.price)/10398.55000*10702.550 和5302.75000/10398.55000*10702.550
却存在结果不一致的情况:结果分别为:5457.76537和5457.77508,5457.77508才是正确的
我试过了,主要是sum(m.qty * m.price)在group by 里面进行/除法运算会出现误差,而乘法是不会的,请问大家,这个是怎么回事啊,要怎么写才不会这样啊?
select sum(m.qty * m.price)/10398.55000*10702.550 as gg,
5302.75000/10398.55000*10702.550 as tt
FROM Ect_cim AS m LEFT OUTER JOIN
dbo.md_glass_prdm AS q ON q.prd_no = m.prd_no LEFT OUTER JOIN dbo.Ebasic_other o
ON (o.code = q.gls_tcf) and (o.otherid = 'glstcf') where m.ci_no='10101927' group by public2,m.packunit

结果:
gg tt
5457.76537 5457.77508

select sum(m.qty * m.price) as qq,10398.55000 as ww,10702.550 as ee FROM Ect_cim AS m LEFT OUTER JOIN
dbo.md_glass_prdm AS q ON q.prd_no = m.prd_no LEFT OUTER JOIN dbo.Ebasic_other o
ON (o.code = q.gls_tcf) and (o.otherid = 'glstcf') where m.ci_no='10101927' group by public2,m.packunit

结果:
qq ww ee
5302.75000 10398.55000 10702.550
...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
coleling 2010-11-23
  • 打赏
  • 举报
回复
SQL SERVER在计算sum(m.qty * m.price)/10398.55000*10702.550时,内部数据类型演变步骤如下:
step 1: decimal(18, 3) * decimal(18, 2) = decimal(37,5)
step 2: sum(decimal(37, 5)) = decimal(38,5)
step 3: decimal(38, 5)/10398.55000 = decimal(38,6)
step 4: decimal(38, 6)*10702.550 = decimal(38,6)

可以看到,误差产生在step 3,SQL SERVER将可能的十几位小数截成了6位。

解决方法: 改成convert(decimal(38,20),sum(m.qty * m.price))/10398.55000*10702.550
eastfar 2010-11-23
  • 打赏
  • 举报
回复
直接这样子算出来是5302.7500000000,直接用这个数据来计算是对的,用sum(m.qty * m.price)/10398.55000*10702.550是错的,m.qty都没有小数位,m.price保留两位,怎么弄
select sum(m.qty * m.price)
FROM Ect_cim AS m LEFT OUTER JOIN
dbo.md_glass_prdm AS q ON q.prd_no = m.prd_no LEFT OUTER JOIN dbo.Ebasic_other o
ON (o.code = q.gls_tcf) and (o.otherid = 'glstcf') where m.ci_no='10101927' group by public2,m.packunit


(无列名)
5302.7500000000
eastfar 2010-11-23
  • 打赏
  • 举报
回复
m.qty 和 m.price 的数据类型分别为decimal(18, 3)和decimal(18, 2)

gg tt
5457.76537 5457.77508

这个值分别是用sum(m.qty * m.price)/10398.55000*10702.550,
5302.75000/10398.55000*10702.550 根据 public2,m.packunit分组算出来的
飘零一叶 2010-11-23
  • 打赏
  • 举报
回复
CREATE TABLE TB
(
A FLOAT,
B FLOAT,
C CHAR(1)
)
INSERT INTO TB
SELECT 1.12345,8.12345,'A' UNION ALL
SELECT 3.12345,7.12345,'A' UNION ALL
SELECT 4.12345,6.12345,'A' UNION ALL
SELECT 5.12345,5.12345,'A' UNION ALL
SELECT 6.12345,4.12345,'A' UNION ALL
SELECT 7.12345,5.12345,'A' UNION ALL
SELECT 8.12345,2.12345,'A'

SELECT SUM(A*B)/7.12345*35.123 FROM TB GROUP BY C
SELECT SUM(A*B) FROM TB GROUP BY C
SELECT 161.8716293175/7.12345*35.123
---------------------------------
(无列名)
797.314748848456
(无列名)
161.7069085125
(无列名)
797.31474884845650621700

测了一下结果差距不大。楼主可以指定下返回数据的小数点的位数。
飘零一叶 2010-11-23
  • 打赏
  • 举报
回复
应该是m.qty 和 m.price的数据类型 影响了结果
coleling 2010-11-23
  • 打赏
  • 举报
回复
m.qty 和 m.price 的数据类型是什么? 在第一行中的值分别是什么?
abuying 2010-11-23
  • 打赏
  • 举报
回复
精确有所损失!加上*1.0
sum(m.qty * m.price)*1.0/10398.55000*10702.550

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧