2016-01-06 32 views
2

我正在使用的Tenis數據庫包含作爲匹配的行。該行具有玩家名稱和條件(贏或輸)。我需要顯示所有玩家的表格,其中顯示玩家名稱,總遊戲數量,勝利數量,損失數量和勝率。SQL SELECT語句根據一個值(「贏」或「損」)顯示贏/輸數量

我還沒有想出如何正確設置SELECT語句來執行我所需要的。地方開始將是:

SELECT player, COUNT(player) FROM tenis_table GROUP BY player

分組由玩家顯示每個獨一無二的球員的名字,和COUNT(球員)給我的總場比賽。但是,我該如何正確創建一個SQL SELECT語句,該語句還能根據「贏」或「損」的條件爲我提供一個包含贏,輸和贏的百分比的列?

+1

請問您可以分享餐桌結構嗎? – Mureinik

+1

與上述同意。需要更好地理解您正在從中提取的tenis_table的屬性。 如果贏/輸比例沒有包含在數據庫中,您需要創建一個用戶定義的函數,該函數將贏得的遊戲總數除以每一行(玩家名稱) – Sean

+0

事情是,那些是唯一相關的欄:球員(這是一個球員的名字)和條件(這是「贏」或「損失」)。有一個日期,對手的名字,以及一些不相關的統計數據。 –

回答

3

實際上,你應該只是要求玩家,TotalGames和Wins。只有

SELECT player, 
    COUNT(*) AS TotalGames, 
    SUM(CASE WHEN condition='win' THEN 1 ELSE 0 END) AS Wins, 
    COUNT(*)-SUM(CASE WHEN condition='win' THEN 1 ELSE 0 END) AS Losses, 
-- SUM(CASE WHEN condition='loss' THEN 1 ELSE 0 END) AS Losses, 
    SUM(CASE WHEN condition='win' THEN 1 ELSE 0 END)*100/COUNT(*) AS WinPercentage 
FROM tenis_table 
GROUP BY player 

此外,COUNT(播放器)會給你的記錄的總數在一組,:一切應在你的代碼來完成,但在這裏它是在情況下,你絕對想從好的設計流浪如果player不爲空。 COUNT(*)我相信速度稍快,因爲它不必檢查每條記錄的player是否爲空,所以我已切換到該位置。

+0

共贏 - >損失。在很多遊戲中你可以擁有聯繫。你應該像計算勝利一樣計算損失。 –

+1

@GordonLinoff是的,我把它作爲一條註釋掉的線,但他確實指出條件是「贏」或「損」,而不是「贏」或「損失」或「平局」,所以在這種情況下,損失=總獲勝。 –

+0

@RobertMcKee嗨,謝謝你。學習新事物總是感覺很好。相反,我在做代碼並贏得比例。哦,「條件」是一個保留字(它確實是表內的名字),我將不得不改變這一列。非常感謝你! –

3

可能寫在MySQL此代碼的最簡單的方法是:

SELECT player, 
     COUNT(*) AS TotalGames, 
     SUM(condition = 'win') AS NumWins, 
     SUM(condition = 'lose') AS NumLosses, 
     AVG(condition = 'win') AS WinPercentage 
FROM tenis_table 
GROUP BY player; 

這使用治療布爾表達式爲數字的MySQL擴展(I碰巧喜歡這個擴展; case也是完全可以接受的)。它簡化了邏輯,並使用AVG()來計算百分比。

我主要是回答,因爲我不同意羅伯特的第一句話:數據庫是做所有計算的好地方。

+1

並且在數據庫中進行計算是違反關注點分離的問題[2NF數據庫規則](https://en.wikipedia。org/wiki/Second_normal_form)強制將無用的數據從數據庫傳輸到客戶端,並且推動對數據庫服務器的計算,在大多數情況下,最好是在客戶端上完成計算,特別是當有多個客戶端並且只有一個數據庫服務器時。所有這些東西都應該推送到業務層(損失)或表示層(WinPercentage)。 –

+3

@RobertMcKee。 。 。你顯然不懂數據庫。 「正常形式」是指數據庫內的數據結構,而不是如何訪問它。 –

+2

它一般指數據的結構。如果沒有數據,你會怎麼稱呼你從數據庫中得到的東西?如果您認爲數據完整性在數據庫中是很重要的,但是我更喜歡讓我的數據完整無損,直到實際使用完成。應用於數據庫的相同基本原則適用於任何數據源,不管它是在RDBMS,集合還是XML文件中。在不需要時複製冗餘數據只會浪費空間,計算時間,引入複雜性和腐敗機會。 –