SQL Server中Count(*)自动取整致日期事件占比查询全为0求助
解决SQL Server中计算事件占比返回0的问题
这个问题我太熟了——SQL Server的整数除法规则就是罪魁祸首!MySQL会自动把整数除法的结果转为浮点数,但SQL Server严格执行整数除法:当两个整数相除时,结果只会保留整数部分,哪怕实际结果是小数。比如你有2条目标日期的事件,总共有5条,2/5在SQL Server里会直接得到0,乘以100之后还是0,这就是你看到的现象。
修复方法:强制转换为非整数类型
只需要把除法运算中的任意一个操作数转为浮点数或DECIMAL类型,就能让SQL Server返回小数结果。这里给你两种常用的写法:
方法1:用1.0乘以分子(最简单)
SELECT -- 用1.0把整数转为浮点数,避免整数除法 (COUNT(CASE WHEN dayOf = '2018-01-01' THEN 1 END) * 1.0 / COUNT(*)) * 100 AS event_percentage FROM event;
方法2:用CAST/CONVERT显式转换类型
如果你需要更精确的控制(比如指定小数位数),可以用显式转换:
SELECT (CAST(COUNT(CASE WHEN dayOf = '2018-01-01' THEN 1 END) AS DECIMAL(10, 2)) / COUNT(*)) * 100 AS event_percentage FROM event;
为什么MySQL没问题?
MySQL的除法规则更宽松:只要除法运算的结果不是整数,就会自动返回FLOAT或DECIMAL类型的小数,所以你在MySQL里能得到正确的百分比。而SQL Server遵循ANSI SQL的严格整数除法规则,必须显式触发浮点运算。
测试验证
用你提供的表结构和数据(假设总共有3条事件,其中2条在2018-01-01):
- 旧写法(错误):
COUNT(...) / COUNT(*) *100→ 返回0 - 新写法(正确):会返回约66.67(取决于你用的转换方式)
内容的提问来源于stack exchange,提问作者Mike PG
相关产品推荐
相关产品推荐

