2011-05-07 68 views
1

我已經得到了這個工作,但它是一個非常糟糕的做法,我需要一些幫助與我的查詢分解。算上「比例?」爲贏得和損失

SELECT `GameDate`, 
    COUNT(CASE 
      WHEN `P1Outcome`= 'win' AND P2Param = 'a' THEN 1 
     END) AS a_win, 
    COUNT(CASE 
      WHEN `P1Outcome`= 'loss' AND P2Param = 'a' THEN 1 
     END) AS a_loss, 
    COUNT(CASE 
      WHEN `P1Outcome`= 'win' AND P2Param = 'b' THEN 1 
     END) AS b_win, 
    COUNT(CASE 
      WHEN `P1Outcome`= 'loss' AND P2Param = 'b' THEN 1 
     END) AS b_loss 
    FROM games 
    WHERE `P2Param` IN ('a', 'b', 'c') 
    GROUP BY GameDate 

這將讓我說,我可以在我的PHP應用程序中使用的查詢,但我想跳過不得不作出在PHP中的實際比率計算,並直接與SQL拿來。

所以基本上我一直試圖做的是類似於此:

COUNT(CASE 
      WHEN `P1Outcome`= 'win' AND P2Param = 'a' THEN 1 Else -1 
     END) AS a_ratio, 

但正如beginer我是,我無法弄清楚如何我可以做這個工作。

編輯: 對不起,沒有更詳細地解釋我的問候,這裏是事情。我正在創建一個統計組件,我需要獲取一段時間的比率,以便將其顯示爲圖形。所以下面的事情要做到:

GameDate(1,2,3,4 ......日前) 根據不同PARAMS(在這種情況下圖)

因此,在短期的球員比例這是我得到的那一刻:

GameDate  a_win  a_loss b_win  b_loss 
2011/04/25  x   x   x   x 
2011/04/23  x   x   x   x 
.... 

所以一切順利偉大的,但我想在SQL所做的實際比率計算,因爲此刻我需要在PHP如$ratio = $q[a_win]-$q[a_loss]而且由於事實上,我有很多不同的參數,我的查詢就像是雙倍大小,因爲我需要獲取勝利和損失,而不是ju首先,比例就像我想要的那樣。

+0

什麼是這個問題? – zerkms 2011-05-07 10:05:17

+0

你正試圖執行的實際比率計算是什麼(目前在PHP中)? – eggyal 2011-05-07 10:06:35

+0

對不起,由於缺乏細節,我更新了問題,因此更容易瞭解問題所在。 – Alexander 2011-05-07 10:51:50

回答

2
SELECT `GameDate`, 
    SUM(CASE `P2Param` 
     WHEN 'a' THEN CASE P1Outcome WHEN 'win' THEN 1 ELSE -1 END 
     ELSE 0 
     END) AS a_ratio, 
    SUM(CASE `P2Param` 
     WHEN 'b' THEN CASE P1Outcome WHEN 'win' THEN 1 ELSE -1 END 
     ELSE 0 
     END) AS b_ratio 
FROM games 
WHERE `P2Param` IN ('a', 'b', 'c') 
GROUP BY GameDate 
+0

另一個試圖將COUNT用作SUM的人。你應該馬上就被低估了:D – Jakub 2011-05-07 12:54:55

+0

@Jakub:傻了......謝謝,修正。 :) – 2011-05-07 12:56:39

+0

我想現在是正確的答案:) – Jakub 2011-05-07 12:57:38

0

什麼:

SELECT COUNT(id), P1Outcome, P2Param 
    FROM games 
GROUP BY P2Param, P1Outcome 

它會回報你有3列一個結果:

  • 爲PARAM和成果
  • 結果
  • PARAM計數值

有了這個,你可以做m礦石在我看來。

+0

謝謝你的回答,但那不是我所需要的,對於缺乏細節感到抱歉,我更新了問題,因此更容易跟蹤問題所在。 – Alexander 2011-05-07 10:51:19

1

什麼是非常重要的COUNT只是返回行數,不管您計算的是什麼,除非您使用COUNT(DISTINCT ...),反過來返回不同值的計數。總結一下您爲每一行使用的產品的一些價值SUM(...)。確保當SUM()函數中的表達式計算爲NULL時,DBMS中會發生什麼情況 - 某些數據庫將使整個SUM返回NULL

要獲得任何類型的數據的比例,你可以這樣做:

select _date_, (SUM(case when _your_test_ then 1 else 0 end)/count(1)) as ratio 
from _yout_table_ 
group by _date_ 

如果你只是想計算一些數值的總和:

select _date_, SUM(case when _your_test_ then 1 else 0 end) as number_of_something 
from _yout_table_ 
group by _date_ 
+0

謝謝你的回答,事情是,當用「/ count(1))」分隔時,它會產生一個浮點數,例如(0.1523)。我只想要int b/c我只有像win = 2和loss = 5這樣的整數。Isen't在那裏像存儲每個計數在一個變量中,並且他們預先計算總和嗎? – Alexander 2011-05-07 12:17:12

+0

通常這個比例被理解爲像某些選定的遊戲/所有遊戲一樣的東西的比例。如果你只是想計算勝利和損失,不要用「COUNT(1)」來劃分,因爲這是用來表示所有games_的數量。 – Jakub 2011-05-07 12:26:59

+0

您可以在一次調用中執行多個SUM函數,如'SELECT SUM(xxx),SUM(yyy),SUM(xxx)-SUM(yyy),SUM(xxx + yyy)'。這樣,您可以將您的總和和計算值存儲在返回的列中(不要與變量混淆)。 – Jakub 2011-05-07 12:44:11

0
SELECT GameDate, P2Param, SUM(CASE WHEN P1Outcome = 'win' THEN 1 ELSE -1 END) AS ratio 
    FROM games 
    GROUP BY GameDate, P2Param