SQL - 计数和名称的不同值的计数和总和

时间:2017-07-05 19:43:54

标签: mysql sql

我有一张包含各种锦标赛结果的表格(仅显示此案例的相关字段):

name,lugar,id,formato

我需要根据玩家的数量及其结果来制作一个不同的值。

name是锦标赛名称,lugar是玩家获得的地方,id为玩家标识符,formato是锦标赛特定领域。

快速示例:

for formato = X,lugar = 1 =>如果名称的总和> 8,则为8分32。

我正在尝试处理计数和案例,搜索但未找到合适的答案。

也许我应该分开表?

此刻我有这个用来总结分数,但不检查formato的球员数。

SELECT name, id, ROUND((sum(pontos)/((sum(rondas)+sum(byes))*3)*100),2) as Performance, 
    sum(case 
              when lugar = '1' then 8 
              when lugar = '2' then 6
              when lugar > '2' AND  lugar < '5' then 4
              when lugar > '4' AND lugar < '9' then 2
              else null end)as Pontos
FROM players 
WHERE season='0' 
GROUP BY id 
ORDER BY `Pontos` DESC, `Performance` DESC 

我已经尝试使用formato ='X'添加一个案例然后总和,但我得到了一个sql错误。

示例填充表:

name    id  format  lugar
maio    1   STD 1
maio    2   STD 2
abril   1   STD 4
abril   3   STD 1
junho   1   MDR 5
junho   2   MDR 1
julho   3   MDR 2
julho   4   MDR 8

期望结果有条件:  如果format = STD,当lugar = 1时,得到8分,lugar = 2得到6分。 如果format = MDR,当lugar = 1时,给出5分,lugar = 2给出3分 如果count id,其中format = STD大于3(正好和示例)1个额外点

如果count id在format = STD(例子)中,根据lugar给出的点会给出不同的点。

所以,对于填充表格,它会给出类似的内容:

id  points  performance
1   17  50
2   10  40
3   4   60
4   1   40

(没有检查值,只是预期结果的示例)。

我想要实施这种条件。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您正在寻找嵌套的case when

  SELECT 
        name
        , id
        , ROUND((sum(pontos)/((sum(rondas)+sum(byes))*3)*100),2) as Performance, 
        sum(  case when formato ='X' THEN
             (case 
                when lugar = '1' then 8 
                when lugar = '2' then 6
                when lugar > '2' AND  lugar < '5' then 4
                when lugar > '4' AND lugar < '9' then 2
                else null end)
                END
      ) as Pontos
  FROM players 
  WHERE season='0' 
  GROUP BY dci 
  ORDER BY `Pontos` DESC, `Performance` DESC 

你可以为formato使用不同的案例

  SELECT 
        name
        , id
        , ROUND((sum(pontos)/((sum(rondas)+sum(byes))*3)*100),2) as Performance, 
        sum(  case 
                when formato ='X' THEN
                 (case 
                    when lugar = '1' then 8 
                    when lugar = '2' then 6
                    when lugar > '2' AND  lugar < '5' then 4
                    when lugar > '4' AND lugar < '9' then 2
                    else null end)
                when formato = 'Y' THEN 100 END

                END
      ) as Pontos
  FROM players 
  WHERE season='0' 
  GROUP BY dci 
  ORDER BY `Pontos` DESC, `Performance` DESC