如何将平均值提高到3位小数

时间:2011-05-12 14:40:38

标签: sql sql-server sql-server-2008

我有以下代码。显示3位小数,但平均值是错误的。有没有办法可以重构代码以获得正确的结果?

with total_indi_days as
(
    SELECT COUNT(*) AS total, DATENAME(DW, DateLog) AS NameOfDay 
    FROM  Access 
    GROUP BY DATENAME(DW, DateLog) 
    --ORDER BY total DESC 
)
,total_overall_days as
(
    SELECT COUNT(*) as total_days FROM  Access
)
select str(((total * 100)/ total_days ), 7, 3) as average, total, total_days, NameOfDay 
from total_indi_days, total_overall_days

...结果

|average | total | total_days | NameOfDay
| 2.000  |  29   |   1000     | Sun           
| 18.000 | 188   |   1000     | Mon             
| 15.000 | 159   |   1000     | Tues         
| 20.000 | 207   |   1000     | Wed             
| 19.000 | 194   |   1000     | Thur           
| 17.000 | 171   |   1000     | Fri             
| 5.000  |  52   |   1000     | Sat  

应该是......

|average | total | total_days | NameOfDay
| 2.900  |  29   |   1000     | Sun           
| 18.800 | 188   |   1000     | Mon             
| 15.900 | 159   |   1000     | Tues         
| 20.700 | 207   |   1000     | Wed             
| 19.400 | 194   |   1000     | Thur           
| 17.100 | 171   |   1000     | Fri             
| 5.200  |  52   |   1000     | Sat  

我还想知道是否有更简单的方法来获得此结果。 “with”有点多,考虑到我有AVG内置功能,这对我不起作用,可能是因为我做错了。

5 个答案:

答案 0 :(得分:2)

更改

select str(((total * 100)/ total_days ), 7, 3) as average  to 

select str(((total * 100.0)/ total_days ), 7, 3) as average

这样,你没有整数除法......

答案 1 :(得分:0)

您可以使用此方法,但它也会对值进行舍入。 CONVERT(数字(10,3),(计数(ID)* 100. / @Total))百分比

答案 2 :(得分:0)

看起来问题是你在数学完成后进行转换。因此,SQL Server正在对整数进行除法,并给出一个整数结果,然后将其转换为小数。尝试将100更改为100.0,这应该可以解决问题。

您也可以CAST列为小数,但只要其中一个值为小数,就应该将其余值转换为十进制的答案,只需将100设为100.0就是最简单的方法。

答案 3 :(得分:0)

total和total_days都是整数,因此结果错误。

这应该有效。

select CAST((total * 100.000)/ total_days AS NUMERIC(19,3)) as average, total, total_days, NameOfDay from total_indi_days, total_overall_days 

答案 4 :(得分:-1)

在MySql中,您可以使用FORMAT

SELECT FORMAT(12332.1,4) => '12,332.1000'