我很难想出一个查询来对结果集进行排序
请参阅http://sqlfiddle.com/#!2/02b65了解表格
每个参赛者都有三个结果,每个参赛者一个。
我希望根据以下内容对结果集进行排序:
我真正不想实现的解决方案是在表格中对电台进行硬编码,例如
| id | competitior_id | value_of_station_1 | value_of_station_2 | value_of_station_3
但这意味着更简单的查询只能对三个站点值的总和进行排序,然后根据上面的描述对每个站点进行排序。
拜托,有人可以帮我吗?我很乐意重新设计表格。
答案 0 :(得分: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
答案 1 :(得分: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;
编辑每个问题/评论
每个电台的MAX()是因为您正在为每个竞争对手进行分组。您不希望多次计算每个站,因为您将拥有3条记录,并且您必须按所有非聚合字段进行分组(很多SQL引擎需要,有些不关心并只抓取第一个实例)。因此,当第一个记录被处理时,它会填充第1站,但是2和3是零值,你不希望它作为你的排序基础。然后当第二个记录被处理时,你有1& 2人口稠密,仍然坐在第三。因此,通过应用MAX(),您将获得每个站点的最高值...每个“0”实例及其实际结果......现在有意义吗?