2011-10-04 27 views
8

Hola, hay una manera en que puedo hacer la SUMA (total_points) basada en una condición diferente al resto de la instrucción SELECT, entonces quiero la SUMA (total_points) para cada fila que es < = to $ chosetrack? pero el resto de las condiciones de la instrucción SELECT son las que están debajo. Necesito que todos sean devueltos juntos ... ya que estoy poblando una tabla de clasificación.SUM() basado en una condición diferente al SELECCIONAR

Muchas gracias por cualquier ayuda.

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

duplicado posible de [suma de SQL con la condición] (http://stackoverflow.com/questions/4517681/sql-sum-with-condition) – Athafoud

+1

@Athafoud usted está realmente fuera de excavación cosas. Impresionante. – Drew

Respuesta

20

También se puede poner la suma dentro de una declaración de caso, donde el caso se evalúa la otra condición, y sólo resumir ver estos registros en los que la condición es verdadera ...

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

pero todavía no se calcula el total de puntos para todas las filas donde track_id en la tabla members_results es menor que $ chosentrack? solo calcula los puntos_total para donde es igual a $ elegido? – user970117

+0

Como [editado] debería calcular las puntas totales para todas las filas donde member_results.trackId es igual a $ chosentrack, Y el total de puntos para todas las filas donde member_results.trackId es menor que $ chosentrack. Tuve que eliminar la condición en la cláusula where ... –

+1

¡eres un hombre hermoso! Funcionó muy bien. gracias de nuevo. – user970117

1

Haz la suma como una subselección, asegurándose de que selecciona una columna adicional (no se olvide de grupo por esa columna) y unirse a los resultado de este subselección a la consulta principal utilizando el campo común.

Plantilla:

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

lo siento, así que quiero la suma (total_points) para cada fila que es <= $ $ elegida, que es la misma variable utilizada en el resto de la declaración, ¿su respuesta aún se aplicará a esto? – user970117

+1

Sí, se aplica, y debería funcionar. esta es solo una forma de hacerlo. Al principio no me di cuenta de que estaba seleccionando columnas de la misma tabla y aplicando una única condición para que el 'caso' sea más legible y tal vez más fácil de optimizar mediante el RDBMS. – Icarus

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