使用case when语句创建的Sum字段

时间:2013-04-22 13:26:18

标签: mysql sql

我有一张比赛分数表;每次任务都有一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务提供最高分数,每个用户一行。这些分数将作为附加列添加(mission_1和mission_2)。到目前为止一切都很好。

但是现在我想总结这两个字段以获得每个用户的总最高分数。但是,MySQL不会让我在'字段列表'中说未知列'mission_1'。

是否有可能以某种方式对这些字段进行求和?

我也想知道是否有可能在单独的列(mission_1_id和mission_2_id)中获得具有最高分数的任务的相应row_id(我的表中的gsid)。但我有一种感觉,因为我正在使用MAX()。

SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on, 
ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score, 
ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
mission_1_score + mission_2_score AS total_score
FROM game_sessions m
GROUP BY username

2 个答案:

答案 0 :(得分:0)

不,不在同一select声明中。您需要子查询或重复表达式。

子查询方法:

select m.* max_id, max_submitted_on, mission_1_score, mission_2_score,
       mission_1_score + mission_2_score AS total_score
from (SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on, 
            ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score, 
            ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
            mission_1_score + mission_2_score AS total_score
      FROM game_sessions m
      GROUP BY username
     ) m

否则,请将原始select语句更改为:

SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on, 
       ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score, 
       ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
       (ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) +
        ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 )
       ) AS total_score

这似乎不优雅,但它是SQL标准的一部分。我认为目的是避免在诸如此类的情况下出现歧义:

select (a + b) as a, (a + 1) as c

a中的(a + 1)是指什么?在SQL标准中,它明确指出表中的列。

答案 1 :(得分:0)

你可以使用

   max(CASE WHEN mission =1 THEN score END )