我有以下代码。显示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内置功能,这对我不起作用,可能是因为我做错了。
答案 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'