这可能有点难以解释,但我的SQL服务器数据库中有两列我已简化...
项
ID
ITEMNAME
voteCount
得分
投票
ITEMID
得分
所以,基本上我存储了放在一个表中的每一个投票,但也计算了项目表中每个项目的投票数以及它的平均得分(满分10分)(我知道它是重复的)数据,但它使事情更容易)。
无论如何,我想创建一个SQL查询,找到得分最低的2个项目。你会想到这很容易,因为你只是这样做......
SELECT TOP 2 itemName FROM Items ORDER BY score ASC;
但是,客户端添加了以下复杂功能。
当2个或更多项目具有相同分数时,具有最高10/10票数的项目将被置于上方。如果2个或更多项目具有相同的分数和相同数量的10/10票数,那么它将对项目进行排名,其中9/10票数高于其他项目,依此类推,直到0/10票数如果一切其他是平等的。
所以,挑战是按照这些标准对所有项目进行排名然后选择底部2.我尝试了分组,聚合和“子查询”的每个组合来解决这个问题,但我认为我需要帮助有人比我聪明。
真的很感激任何帮助。
澄清
项目的平均分数存储在项目表中,每个投票的分数保存在投票表格中。最初我们需要按平均分数(I.score)排名,其中2项具有相同的分数,我们需要开始计算与该项目相关的投票中10/10的数量(v.score)。
所以,我们可能会有一个名为“T恤”的项目,平均得分为5/10。这来自6票,得分为5,5,5,5,5,5。
下一个项目名为“法拉利”,平均得分为5/10,但这个项目只有4票,得分如下6,5,5,4
显然,法拉利应该会赢,因为sql会看到它没有10,没有9,没有8,而不是7,但它确实有6票,胜过T恤。答案 0 :(得分:1)
SELECT TOP 2 i.itemName
FROM Items i
left outer join (
select ItemID,
sum(case when score = 10 then 1 end) as Score10,
sum(case when score = 9 then 1 end) as Score9,
sum(case when score = 8 then 1 end) as Score8,
sum(case when score = 7 then 1 end) as Score7,
sum(case when score = 6 then 1 end) as Score6,
sum(case when score = 5 then 1 end) as Score5,
sum(case when score = 4 then 1 end) as Score4,
sum(case when score = 3 then 1 end) as Score3,
sum(case when score = 2 then 1 end) as Score2,
sum(case when score = 1 then 1 end) as Score1
from Votes
group by ItemID
) v on i.ID = v.ItemID
ORDER BY i.score,
v.Score10,
v.Score9,
v.Score8,
v.Score7,
v.Score6,
v.Score5,
v.Score4,
v.Score3,
v.Score2,
v.Score1