(非常奇怪)关于在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
...全文
172 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

内容概要:本文围绕基于三重移相控制(TPS)的双有源桥(DAB)高频隔离DC-DC变换器开展系统性研究,重点构建了其在Simulink环境下的高精度仿真模型。研究全面涵盖SPS单相移相、DPS双重重移相与TPS三重移相等多种控制策略的建模、实现与性能对比,深入分析不同模式下变换器的功率传输特性、软开关实现条件及功率回流问题,旨在提升DAB在交直流混合微电网、能量路由器、多端口柔性互联装置等场景中的转换效率与动态响应能力。通过对ZVS(零电压切换)条件的精确控制与移相角参数的优化,有效降低了开关损耗,增强了系统整体能效与运行稳定性。该仿真模型具有良好的可扩展性,适用于复杂电能转换系统的科研验证与工程开发。; 适合人群:电力电子、电气工程及其自动化等相关专业的硕士研究生、博士生、科研人员以及从事新能源变换器、柔性输配电系统设计的工程技术人员。; 使用场景及目标:①掌握双有源桥DAB变换器的基本工作原理及其在高频隔离场合的核心优势;②深入理解三重移相控制策略的设计机理、控制自由度分配及其在效率优化中的关键作用;③构建并调试可用于科研论文撰写、项目申报或实际系统验证的高保真Simulink仿真模型,支撑理论分析与实验对比。; 阅读建议:建议结合MATLAB/Simulink平台进行动手实践,重点关注主电路拓扑搭建、移相控制模块设计、驱动信号时序配置及ZVS实现条件的仿真观测,推荐通过对比SPS、DPS与TPS三种模式的稳态与动态响应曲线,深入掌握各控制策略的适用边界与优化方向。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!

22,297

社区成员

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

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