我做了下面的查询,但是给每个orderStatusName结果为0,有人知道问题出在哪里吗?
with tbl as (
select s.orderstatusName, c.orderStatusId,count(c.orderId) counts
from [dbo].[ci_orders] c left join
[dbo].[ci_orderStatus] s
on s.orderStatusId = c.orderStatusId
where orderedDate between '2018-10-01' and '2018-10-29'
group by orderStatusName, c.orderStatusId
)
select orderstatusName, counts/(select sum(counts) from tbl as PofTotal) from tbl
结果是:0
答案 0 :(得分:7)
您正在使用所谓的整数数学。在SQL(服务器)中使用2个整数时,返回值也是一个整数。例如,2 + 2 = 4
,5 * 5 = 25
。同样适用于除法8 / 10 = 0
。这是因为0.8
不是整数,但是返回值将是1(因此小数点会丢失)。
更改此行为的常用方法是将一个表达式乘以1.0
。例如:
counts/(select sum(counts) * 1.0 from tbl) as PofTotal
如果需要更高的精度,则可以提高1.0
的十进制值的精度(即,提高到1.000
,1.0000000
等)。
答案 1 :(得分:1)
使用窗口功能和适当的划分:
select orderstatusName, counts * 1.0 / total_counts
from (select t.*, sum(counts) over () as total_counts
from tbl
) t;
得到0
的原因是因为当操作数是整数时,SQL Server会进行整数除法。所以1/2 = 0,而不是0.5。