2012-11-03 41 views
0

我用下面的查詢找出遊戲的英雄贏得的百分比:如何找到SQL中的值的百分比?

SELECT Hero, (COUNT(*) * g.games) AS p 
FROM gamestatistics 
JOIN (
SELECT 100/COUNT(*) AS games 
FROM gamestatistics 
) AS g 
WHERE PointEarned>0 
GROUP BY Hero 
ORDER BY p DESC 

但是這給了我百分之所有遊戲。我想知道

percentage(for Hero)=(Won games by this player)/(Played games by this hero)

,而不是

百分比(英雄)=(該玩家贏得遊戲)/(所有遊戲)
感謝。

+0

你就不能後您的'WHERE PointEarned> 0'加上'WHERE英雄= whatever'? – noko

+0

不要以數字(*)除,它可能爲零。 – dotvav

+0

但是,這隻會給我1個英雄的信息,我需要所有的英雄。而這不會改變,這將劃分上的所有遊戲,而不是遊戲中這個英雄打 – Tonven

回答

4
SELECT hero, AVG(pointEarned > 0) p 
FROM gamestatistics 
GROUP BY 
     hero 
ORDER BY 
     p DESC 
+0

它的工作原理!謝謝! – Tonven

+0

@tonven我無法看到這可以返回一個百分比。我甚至不能編譯它 –

+2

@ t-clausen.dk:'AVG'接受'BOOLEAN'自動廣播到的'NUMERIC'。 'pointEarned> 0'產生'1'或'0'(或者如果該字段爲空則爲NULL)。 – Quassnoi

2

試試這個

select 
    gc.Hero, 
    sum(case when gc.PointEarned > 0 then 1 else 0 end)/count(*) as p 
from gamestatistics as gc 
group by by gc.Hero 
order by p desc 
+0

它的工作原理!謝謝!你能解釋一下它是如何工作的嗎? – Tonven

+1

well'sum'只是每行的總和值。在這種情況下,如果遊戲獲勝,則只需添加1,如果不是,則爲0。你可以使用'case'語句。 –

1

使用count(HERO)代替count(*),因爲我想它不能夠通過適當執行組。

SELECT Hero, (COUNT(HERO) * g.games) AS p 
    FROM gamestatistics 
    JOIN (
     SELECT 100/COUNT(*) AS games 
     FROM gamestatistics 
) AS g 
    WHERE PointEarned>0 
    GROUP BY Hero 
    ORDER BY p DESC; 

編輯:我相信你想sum of PointsEarned由數進行劃分。在這種情況下,查詢時幾乎沒有變化如下:

SELECT Hero, (SUM(case when PointEarned <1 then 0 else 1 end)*100/count(HERO)) AS p 
FROM gamestatistics 
GROUP BY Hero 
ORDER BY p DESC; 
+0

它不工作:( – Tonven

+0

@Tonven:對不起,我忘了'COUNT(HERO)'查詢嘗試更新的查詢 –

+0

現在,它的工作原理,但仍返回百分比所有遊戲 – Tonven