2011-06-10 20 views
0

下面的這條語句爲我提供了一些我需要的數據。如何分隔在select語句中求和的兩列?

select TankName, COUNT(*) as Tanks, sum(Battles) as Battles, 
    SUM(victories) as Victories 
from MemberTanks 
where Tier = 9 and Class = 'Medium' 
group by TankName 
order by Tanks desc 

我想在結果集中顯示勝利的百分比,但我不知道該怎麼做。我試過...

select TankName, COUNT(*) as Tanks, sum(Battles) as Battles, 
    SUM(victories) as Victories, SUM(Victories)/SUM(Battles) as Percentage 
from MemberTanks 
where Tier = 9 and Class = 'Medium' 
group by TankName 
order by Tanks desc 

...但百分比在每一行回來爲「0」。

我該如何最好地得到這個值?

+0

什麼是Vicotires和Battles的數據類型?另外,他們有沒有任何空值。 – YetAnotherUser 2011-06-10 18:04:13

+0

沒有空值。他們都是「int」 – 2011-06-10 18:05:04

+1

啊......我想我知道這是怎麼回事。我敢打賭,這是一個投射問題。 – 2011-06-10 18:05:45

回答

4

當你計算百分比柱因爲SUM(X)是返回一個INT值,其結果是得到地板,因此與像1.0十進制值返回0作爲地板的結果

乘以SUM(勝利) (以便將一個操作數轉換爲十進制/數字),然後您將得到正確的結果。或者也

SELECT TankName, 
    COUNT(*) as Tanks, 
    SUM(Battles) as Battles, 
    SUM(victories) as Victories, 
    SUM(victories) * 1.0/ SUM(Battles) AS Percentage 
FROM MemberTanks 
WHERE Tier = 9 
    AND Class = 'Medium' 
GROUP BY TankName 
ORDER BY Tanks desc 

,如果您使用的是SQL Server 2005的上方,你可以使用CTE像下面減少calculations.computations:

試試這個

WITH qry AS 
(
    SELECT TankName, 
     COUNT(*) as Tanks, 
     SUM(Battles) as Battles, 
     SUM(victories) as Victories 
    FROM MemberTanks 
    WHERE Tier = 9 
     AND Class = 'Medium' 
    GROUP BY TankName 
) 
SELECT a.*, 
       Victories * 1.0/Battles AS Percentage 
    FROM qry a 
ORDER BY Tanks DESC 
2

試試這個 -

SUM(Convert(float, Battles))/ Sum(Convert(float, Victories)) 

MSDN:

返回優先級較高的參數 的數據類型。有關更多 信息,請參閱數據類型優先級 (Transact-SQL)。

如果整數被除數通過 除以整數除數,結果是 整數,其具有任何小數部分的結果截斷的 。