2011-05-12 62 views
1

我有以下代碼。正在顯示3位小數,但平均值是錯誤的。有沒有一種方法可以重構代碼以實現正確的結果?如何獲得平均值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內置的功能,這對我來說並不適用,也許是因爲我做錯了事情。

+1

你爲什麼要用MySQL *和* SQL-Server?你在使用哪一個? – FrustratedWithFormsDesigner 2011-05-12 14:43:40

+0

@FrustratedWithFormsDesigner - 對不起... – MrM 2011-05-12 14:48:12

回答

2

變化

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

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

這樣,您就不必整數除法...

+0

謝謝!這是我需要的 – MrM 2011-05-12 15:06:36

0

您可以使用此方法,但它也會將值舍入。 CONVERT(數字(10,3),(計數(ID)* 100/@Total))的百分比

-1

在MySQL中,你可以使用的格式

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

雖然數據類型是錯誤的... – gbn 2011-05-12 14:57:06

0

它看起來像問題是,你在數學完成後重新轉換。因此,SQL Server正在對整數進行除法並給出一個整數結果,然後將結果轉換爲小數。嘗試將100更改爲100.0,這應該可以解決問題。

您也可以將CAST列轉爲小數,但只要其中一個值是小數,它應該將餘下的轉換爲以小數爲單位的答案,並簡單地將100設置爲100.0是最簡單的方法去做。

0

總額和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