Группа SQL Server, по которой подсчитываются вхождения оценки - PullRequest
0 голосов
/ 02 февраля 2010

Это может быть немного сложно объяснить, но у меня есть две колонки в моей базе данных SQL-сервера, которые я упростил ...

Продукты
ID
ITEMNAME
voteCount
оценка

1012 * Голоса *
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).

Итак, у нас может быть предмет под названием «футболка», который имеет средний балл 5/10. Это 6 голосов при следующих 5,5,5,5,5,5.

Следующий элемент называется «Ferrari» и также имеет средний балл 5/10, но этот элемент имеет только 4 голоса со следующими баллами 6,5,5,4

Ясно, что Ferrari должен победить, потому что sql увидит, что у него нет ни 10, ни 9, ни 8, ни 7, но у него есть голос 6, который превосходит футболку.

1 Ответ

1 голос
/ 02 февраля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...