2011-10-04 16 views
8

Ciao c'è un modo per eseguire il SUM (total_points) in base a una condizione diversa rispetto al resto dell'istruzione SELECT, quindi voglio SUM (total_points) per ogni riga che è < = in $ chosentrack? ma il resto delle condizioni dell'istruzione SELECT è ciò che sono sotto. Ho bisogno che tutti vengano restituiti insieme ... mentre sto compilando una classifica.SUM() in base a una condizione diversa per SELECT

Grazie mille per qualsiasi aiuto.

SELECT 
    members.member_id, 
    members.teamname, 
    SUM(total_points) as total_points, 
    total_points as last_race_points 
FROM 
    members, 
    members_leagues, 
    member_results 
WHERE 
    members.member_id = members_leagues.member_id 
    AND members_leagues.league_id = '$chosenleague' 
    AND member_results.track_id = '$chosentrack' 
    AND members_leagues.start_race = '$chosentrack' 
    AND member_results.member_id = members_leagues.member_id 
GROUP BY 
    members.member_id 
ORDER BY 
    member_results.total_points DESC, 
    last_race_points DESC, 
    members.teamname DESC 
+0

Eventuali duplicati di [somma SQL con condizioni] (http://stackoverflow.com/questions/4517681/sql-sum-with-condition) – Athafoud

+1

@Athafoud si sta veramente fuori scavare roba. Impressionante. – Drew

risposta

20

Si può anche mettere la somma all'interno di una dichiarazione caso, in cui il caso di valutare l'altra condizione, e poi sommare solo thoses record in cui la condizione è vera ...

SELECT m.member_id, m.teamname, 
    Sum(Case When r.track_Id = '$chosentrack' 
     Then total_points Else 0 End) TotalChosenTrackPoints, 
    Sum(Case When r.track_Id < '$chosentrack' 
     Then total_points Else 0 End) TotalLessThanChosenTrackPoints, 
    total_points as last_race_points 
FROM members m 
    Join members_leagues l 
     On l.member_id = m.member_id 
    Join member_results r 
     On r.member_id = m.member_id 
Where l.league_id = '$chosenleague' 
    And l.start_race = '$chosentrack' 
Group By m.member_id 
Order By r.total_points Desc, 
    last_race_points Desc, m.TeamName Desc 
+0

ma non sta ancora calcolando i total_points per tutte le righe dove track_id nella tabella members_results è inferiore a $ chosentrack? sta calcolando solo i total_points per cui è uguale a $ chosentrack? – user970117

+0

Come [modificato] si dovrebbe calcolare il punto finale totale per tutte le righe dove member_results.trackId è uguale a $ chosentrack, E i punti totali per tutte le righe dove member_results.trackId è inferiore a $ chosentrack. Ho dovuto rimuovere la condizione nella clausola where ... –

+1

your a beautiful man! ha funzionato alla grande grazie ancora. – user970117

1

fare la somma come un sub-SELECT, facendo in modo che si seleziona una colonna aggiuntiva (non dimenticate di gruppo da quel colonna) e unire il risultato di questa subselect per l'interrogazione principale utilizzando il campo comune.

Template:

Select col1, 
col2 as t,x.thesum 
From table t left join 
(select sum(colx) as thesum, col1 from t where ... 
Group by col1) x on t.col1=x.col1 
Where .... 
+0

scusa quindi voglio la SUM (total_points) per ogni riga che è <= per $ chosentrack, che è la stessa variabile usata nel resto dell'istruzione, la tua risposta si applicherà ancora a questo ??? – user970117

+1

Sì, si applica e dovrebbe funzionare. questo è solo un modo per farlo. All'inizio non mi ero reso conto che stavi selezionando colonne dalla stessa tabella e applicando una singola condizione, in modo che il 'caso' potesse essere più leggibile e forse più facile da ottimizzare da parte di RDBMS. – Icarus

2
SELECT ... 
SUM(CASE 
WHEN track_id <= [your_value] THEN total_points 
ELSE 0 
END 
) AS total_points, .... 
Problemi correlati