2017-07-02 62 views
0

我有這個表在MySQL:MYSQL - 的最近10天的SUM值

| player1 | player2 | date | fs_1 | fs_2 | 
    Jack   Tom  2015-03-02  10   2 
    Mark  Riddley 2015-05-02  3   1 
    ... 

我需要知道有多少個ACE球(fs_1)播放器1之前已經在date_g報道比賽做(前10天例)。

這是我嘗試沒有成功:

OPTION 1

SELECT 
    players_atp.name_p AS 'PLAYER 1', 
    P.name_p AS 'PLAYER 2', 
    DATE(date_g) AS 'DATE', 
    result_g AS 'RESULT', 
    FS_1, 
    FS_2, 
    SUM(IF(date_sub(date_g, interval 10 day)< date_g, FS_1, 0)) AS 'last 10 days' 
FROM 
    stat_atp stat_atp 
     JOIN 
    backup3.players_atp ON ID1 = id_P 
     JOIN 
    backup3.players_atp P ON P.id_p = id2 
     JOIN 
    backup3.games_atp ON id1_g = id1 AND id2_g = id2 
     AND id_t_g = id_t 
     AND id_r_g = id_r 
WHERE 
    date_g > '2015-01-01' 
GROUP BY ID1; 

OPTION 2

SELECT 
    players_atp.name_p AS 'PLAYER 1', 
    P.name_p AS 'PLAYER 2', 
    DATE(date_g) AS 'DATE', 
    result_g AS 'RESULT', 
    FS_1, 
    FS_2, 
    SUM(CASE WHEN date_g between date_g and date_sub(date_g, interval 10 day) then fs_1 else 0 end) AS 'last 10 days' 
FROM 
    stat_atp stat_atp 
     JOIN 
    backup3.players_atp ON ID1 = id_P 
     JOIN 
    backup3.players_atp P ON P.id_p = id2 
     JOIN 
    backup3.games_atp ON id1_g = id1 AND id2_g = id2 
     AND id_t_g = id_t 
     AND id_r_g = id_r 
WHERE 
    date_g > '2015-01-01' 
GROUP BY ID1; 

我已編輯的代碼,現在更容易閱讀和下站。

SELECT 
    id1 AS 'PLAYER 1', 
    id2 AS 'PLAYER 2', 
    DATE(date_g) AS 'DATE', 
    result_g AS 'RESULT', 
    FS_1, 
    FS_2, 
    SUM(CASE 
     WHEN date_g BETWEEN date_g AND DATE_SUB(date_g, INTERVAL 10 DAY) THEN fs_1 
    END) AS 'last 20 days' FROM 
    stat_atp stat_atp 
     JOIN 
    backup3.games_atp ON id1_g = id1 AND id2_g = id2 
     AND id_t_g = id_t 
     AND id_r_g = id_r GROUP BY ID1; 

Thanx提前。

+1

,你能不能給我們的其他表?這會更容易理解,尤其是因爲您正在爲統計信息(GROUP BY)使用聚合。但是,您不應該在查詢的投影部分(SELECT)中使用條件。它更適合於限制部分(WHERE)。 –

+0

這裏有進一步標準化的範圍 – Strawberry

+0

我已更新代碼。檢查它是否更簡單。 –

回答

0

也許這可以幫助你:

SELECT 
    id1, 
    SUM(fs_1) 
FROM 
    stat_atp 
WHERE 
    date_g <= DATE_SUB('2015-03-02', INTERVAL 1 DAY) AND date_g >= DATE_SUB('2015-03-02', INTERVAL 10 DAY) 
AND 
    id1='Jack' 
GROUP BY id1; 

記住,RDBMS是用於構建每個人之間有明確的IDS(談到SQL時)鏈接嚴格的數據集。更容易尊重三個第一正常形式。這就是爲什麼你應該使用鍵來識別你自己的匹配。通過這種方式,您可以使用子查詢(子集)來實現您的目標。

然後,請記住SQL是STRUCTURED。這是它的力量和弱點,因爲你將無法將它用作具有循環和條件的圖靈完整編程語言。但是在任何情況下,您都可以爲查詢找到相同的結構。但是,您可以使用另一種語言與SQL查詢結果進行交互,並在結果集本身上使用循環和條件。這取決於你。

不管怎樣,你可能需要閱讀關於MySQL的GROUP BY子句是從ISO SQL形式不同:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

非常感謝。 我用你的實現編輯了代碼,它的工作原理並不像我想的那樣。在您的建議之後,我會嘗試使用mathlab來改進查詢。 –

+0

不客氣!也許你可以爲這個答案投票,如果它有幫助你。 –