2017-03-01 4 views
1

J'ai la requête suivante:Fonction SQL-DateAdded et Somme question

SELECT 
    p.name as Name, SUM(r.attempts) as Attempts, SUM(r.gains) as Positive,  
    SUM(r.losses) as Negative, SUM(r.yards) as Net, SUM(r.touchdowns) as TD, 
    SUM(r.longest) as Long, year(g.date_) as Season 
FROM 
    Rush AS r 
INNER JOIN     
    PlayerGame AS pg ON r.playerGame_Id = pg.playerGame_Id 
INNER JOIN 
    Players AS p ON p.player_Id = pg.player_Id 
INNER JOIN 
    Games as g ON g.game_Id = pg.game_Id 
WHERE 
    g.date_ LIKE CASE 
        WHEN month(g.date_) = 1 
         THEN DATEADD(year, -1, g.date_) 
        ELSE g.date_ 
       END 
GROUP BY 
    year(date_), name 
ORDER BY 
    Season DESC, Attempts DESC, Positive, Negative, Net, TD, Long 

Je cherche à obtenir la somme de toutes les statistiques de chaque saison. J'essaie d'ajouter tous les matchs supplémentaires joués en janvier pour une saison complète. Lorsque j'exécute cette requête, les saisons sont séparées par les dates de janvier. Cependant, pour tous les matchs joués en janvier, il ne les ajoute pas à la somme de toutes les tentatives, yards, etc. Si quelqu'un peut vous aider ou si vous avez besoin d'un contexte supplémentaire, faites-le moi savoir. Merci

+0

vous voulez dire que votre saison commence février et fin janvier? – scaisEdge

+0

Oui, en substance – MattInTheHat

+0

Vous auriez besoin de répéter la logique 'CASE' que vous avez. Cependant, dans une perspective à long terme, j'aurais une table des saisons comme je vais le décrire dans ma réponse –

Répondre

1

Vous devez utiliser un an avec un mois retranchées cela pour mysql

SELECT p.name as Name, SUM(r.attempts) as Attempts, SUM(r.gains) as Positive,  
SUM(r.losses) as Negative, SUM(r.yards) as Net, SUM(r.touchdowns) as TD, 
SUM(r.longest) as Long, year(DATE_SUB(date_,INTERVAL 1 MONTH)) as Season 
FROM Rush AS r INNER JOIN     
PlayerGame AS pg ON r.playerGame_Id = pg.playerGame_Id 
INNER JOIN Players AS p ON p.player_Id = pg.player_Id 
INNER JOIN Games as g ON g.game_Id = pg.game_Id 

Group by year(DATE_SUB(date_,INTERVAL 1 MONTH)), name 
Order by Season DESC, Attempts DESC, Positive, Negative, Net, TD, Long 

Ceci pour sql-server

SELECT p.name as Name, SUM(r.attempts) as Attempts, SUM(r.gains) as Positive,  
SUM(r.losses) as Negative, SUM(r.yards) as Net, SUM(r.touchdowns) as TD, 
SUM(r.longest) as Long, year(DATEADD(month, -1, date_)) as Season 
FROM Rush AS r INNER JOIN     
PlayerGame AS pg ON r.playerGame_Id = pg.playerGame_Id 
INNER JOIN Players AS p ON p.player_Id = pg.player_Id 
INNER JOIN Games as g ON g.game_Id = pg.game_Id 

Group by year(DATEADD(month, -1, date_)), name 
Order by Season DESC, Attempts DESC, Positive, Negative, Net, TD, Long 
+0

il me dit que DATE_SUB n'est pas une fonction intégrée – MattInTheHat

+0

quelle DB utilisez-vous? – scaisEdge

+0

Réponse mis à jour pour sqlserver aussi – scaisEdge

0

Créer une table avec des colonnes SeasonsSeason, SeasonStart et SeasonEnd.

SELECT p.name as Name, SUM(r.attempts) as Attempts, SUM(r.gains) as Positive,  
SUM(r.losses) as Negative, SUM(r.yards) as Net, SUM(r.touchdowns) as TD, 
SUM(r.longest) as Long, s.Season as Season 
FROM Rush AS r INNER JOIN     
PlayerGame AS pg ON r.playerGame_Id = pg.playerGame_Id 
INNER JOIN Players AS p ON p.player_Id = pg.player_Id 
INNER JOIN Games as g ON g.game_Id = pg.game_Id 
INNER JOIN Seasons AS s on g.date_ BETWEEN s.SeasonStart AND s.SeasonEnd 
Group by s.Season, name 
Order by s.Season DESC, Attempts DESC, Positive, Negative, Net, TD, Long 

Ensuite, le besoin de logique de date spéciale disparaît et est représenté par la table.