0

我很难想出一个查询来对结果集进行排序

表见http://sqlfiddle.com/#!2/02b65

每个参赛者有三个结果,每个站一个。

我希望结果集按照以下方式排序:

  1. 总结果 = station1+station2+station3
  2. 3号站的价值下降
  3. 站 2 的值下降
  4. 站 1 的值递减

我真的不想实施的一个解决方案是对表格中的站点进行硬编码,例如

| id | competitior_id | value_of_station_1 | value_of_station_2 | value_of_station_3

但这意味着一个更简单的查询,只对三个站点值的总和进行排序,然后根据我上面的描述对每个站点进行排序。

拜托,谁能帮我解决这个问题?我完全愿意重新设计表格。

4

2 回答 2

2

试试这个查询:

SELECT (SELECT SUM(value_of_station_1+value_of_station_2+value_of_station_3) FROM results B WHERE B.id = A.id) as sum_station, A.* FROM results A ORDER BY sum_station DESC

在这里您可以查看示例:http ://sqlfiddle.com/#!2/020b5/2

于 2013-06-12T17:13:18.103 回答
0

根据我对您帖子的待定评论...

每个竞争对手都有所有站点的总成绩......如果多个竞争对手之间存在“平局”,您希望从第 3 站提供的得分最高的那些被排序到顶部(在相同的“总成绩”组中的竞争对手),如果相同,则根据第 2 站的最高分数排序下一个级别,最后是第 1 站的分数。

select
      R.competitor_id,
      sum( R.result ) as TotalResults,
      max( case when R.Station = 3 then R.Result else 0 end ) as Station3,
      max( case when R.Station = 2 then R.Result else 0 end ) as Station2,
      max( case when R.Station = 1 then R.Result else 0 end ) as Station1
   from
      Results R
   group by 
      R.competitor_ID
   order by
      TotalResults DESC,
      Station3 DESC,
      Station2 DESC,
      Station1 DESC;

SQL 小提琴查询

编辑每个问题/评论

每个站的 MAX() 是因为您按每个竞争对手分组。您不想多次计算每个站,因为您将有 3 条记录,并且您必须按所有非聚合字段进行分组(许多 SQL 引擎需要,有些不关心,只获取第一个实例)。因此,当处理第一条记录时,它会填充站 1,但 2 和 3 是零值,您不希望将其作为排序的基础。然后当第二条记录被处理时,您填充了 1 和 2,仍然坐着在第三个。因此,通过应用 MAX(),您将获得每个站的最高值...每个“0”实例及其实际结果...现在有意义吗?

于 2013-06-12T18:36:34.383 回答