获取列的总和并用于计算总数的百分比,为什么不适用于CTE

时间:2018-10-29 16:01:33

标签: sql sql-server calculation

我做了下面的查询,但是给每个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

2 个答案:

答案 0 :(得分:7)

您正在使用所谓的整数数学。在SQL(服务器)中使用2个整数时,返回值也是一个整数。例如,2 + 2 = 45 * 5 = 25。同样适用于除法8 / 10 = 0。这是因为0.8不是整数,但是返回值将是1(因此小数点会丢失)。

更改此行为的常用方法是将一个表达式乘以1.0。例如:

counts/(select sum(counts) * 1.0 from tbl) as PofTotal

如果需要更高的精度,则可以提高1.0的十进制值的精度(即,提高到1.0001.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。