2011-10-04 42 views
8

嗨有没有一种方法可以根据与SELECT语句的其余部分不同的条件来执行SUM(total_points),所以我希望SUM(total_points)为每行都是< =到$ chosenntrack?但SELECT语句的其余条件成为它们下面的内容。我需要他们都被一起归还..因为我正在填充一个联赛桌。SUM()基于不同条件的SELECT

非常感谢您的帮助。

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

[SQL sum with condition]的可能重复(http://stackoverflow.com/questions/4517681/sql-sum-with-condition) – Athafoud

+1

@Athafoud你真的在挖掘东西了。令人印象深刻。 – Drew

回答

20

你也可以把总和case语句,其中的情况下评估其他条件里面,然后只放入系统总结其中的记录条件为真...

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

但它仍然没有计算members_results表中的track_id小于$ chosenntrack的所有行的total_points?它唯一的计算total_points为何等于$ chosenntrack? – user970117

+0

由于[编辑]它应该计算member_results.trackId等于$ chosenntrack的所有行的总和,以及其中member_results.trackId小于$ chosenntrack的所有行的总点数。我不得不删除条款中的条款... –

+1

你的一个美丽的男人!效果很好。再次感谢。 – user970117

1

执行和作为子查询,确保你选择的附加列(不要忘记按该列组),加入这个子选择使用公共领域的主要查询的结果。

模板:

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

对不起,所以我希望SUM(total_points)为<=到$ chosenntrack,这是在声明的其余部分使用相同的变量的每一行,你的答案仍然适用于此? – user970117

+1

是的,它适用,它应该工作。这只是一种方法。起初,我没有意识到你是从同一个表中选择列并应用单一条件,这样'案例'可能更易读,并且可能更容易通过RDBMS进行优化。 – Icarus

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