0

これを説明するのは少し難しいかもしれませんが、SQL サーバー データベースには単純化した 2 つの列があります...

アイテム
ID
itemName
voteCount
スコア

投票
itemID
スコア

したがって、基本的には、1 つのテーブルに配置されたすべての投票を格納していますが、アイテム テーブル内の各アイテムの投票数のカウントと、その平均スコア (10 点満点中) も格納しています (データが重複していることはわかっていますが、物事をより簡単にします)。

とにかく、スコアが最も低い2つのアイテムを見つけるSQLクエリを作成したいと思います。これを行うだけなので、これは簡単だと思います...

SELECT TOP 2 itemName FROM Items ORDER BY score ASC;

ただし、クライアントは次の複雑さを追加しました。

2 つ以上の項目が同じスコアの場合、10/10 票の最高数の項目が上に配置されます。2 つ以上の項目が同じスコアで、同じ数の 10/10 票を持っている場合、他の項目よりも 9/10 票が多い項目がランク付けされます。それ以外は等しいです。

したがって、課題は、これらの基準によってすべてのアイテムをランク付けし、下位 2 を選択することです。これを解決するために、グループ化、集計、および「サブクエリ」のあらゆる組み合わせを試しましたが、もっと賢い人の助けが必要だと思います私より。

どんな助けでも本当に感謝します。

明確化

アイテムの平均スコアはアイテム テーブルに保存され、各投票に対するスコアは投票テーブルに保持されます。最初に、平均スコア (I.score) でランク付けする必要があり、2 つのアイテムが同じスコアを持つ場合、そのアイテムにリンクされた投票 (v.score) の 10/10 の数を数え始める必要があります。

したがって、平均スコアが 5/10 の「T シャツ」というアイテムがあるとします。これは、次のスコア 5、5、5、5、5、5 の 6 票から得られます。

次のアイテムは「フェラーリ」と呼ばれ、同じく平均スコアが 5/10 ですが、このアイテムは 4 票しかなく、次のスコアは 6,5,5,4 です。

SQL は 10 も 9 も 8 も 7 も持っていないことを確認するため、明らかにフェラーリが勝つはずですが、T シャツに勝る 6 票があります。

4

1 に答える 1

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
于 2010-02-02T02:30:11.953 に答える