SQL Server组用于计算分数的出现次数

时间:2010-02-02 01:49:33

标签: sql sql-server sql-server-2005 group-by aggregate-functions

这可能有点难以解释,但我的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恤。

1 个答案:

答案 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