2017-07-02 17 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 
    ... 

私は(fs_1)プレイヤー1は、10日前まで(date_gで報告された試合の前に行われているどのように多くのエース知っておく必要があります例)。

これは私が成功せずにしようとしたものです:私は今、コードを編集した

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)にconditionを使用しないでください。制限部分(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の話)によって、お互いの間でリンクされている厳格なデータセットを構築するために使用されていることを覚えておいてください。 3つの最初のの通常の書式を尊重する方が簡単です。そのため、キーを使ってマッチを識別する必要があります。このようにして、サブクエリ(サブセット)を使用して目標を達成することができます。

次に、SQLはSTRUCTUREDであることに注意してください。ループと条件付きの完全なプログラミング言語であるチューリングとしては使用できないため、その力と弱点です。しかし、どのような状況でも、同じ構造をクエリで見つけることができます。しかし、SQLクエリーの結果と別の言語で対話し、結果セット自体にループと条件を使用することができます。それはあなた次第です。

とにかく、あなたはISOのSQLフォームから異なっているBY句のMySQL GROUPについて読むことをお勧めします:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

Thanx a lot。 あなたの実装でコードを編集しましたが、うまく動作しません。私はあなたの提案の後に、質問を改善するためにmathlabを試してみます。 –

+0

よろしくお願いします!それがあなたを助けてくれたら、この回答に投票することもできます。 –

関連する問題