Topic: Место в конкурсе

Добрый день! Помогите, пожалуйста.
Есть таблица с ФИО и столбцами (оценки за вопросы и итоговые балы = сумма всех баллов).
Например:
| № | ФИО               | 1 | 2 | 3 | 4 | 5 | 6 | Итого | Место | 
| 1  | Иванов Иван | 2 | 2 | 3 | 2 | 3 | 2 | 13       |            |
| 2  | Ильин Илья   | 2 | 3 | 3 | 3 | 3 | 2 | 15       |            |
| 3  | Петров Петр | 2 | 2 | 3 | 2 | 3 | 1 | 12       |            |
Как сделать, чтобы в столбце "Место" проставлялось место, в соотсветствии с набранной суммой баллов, с группировкой (в случае одинаковых сумм (несколько человек первое место или другое)?
Спасибо заранее!

2 (edited by sparrow 2024-12-09 14:43:13)

Re: Место в конкурсе

The query can be simplified by using new versions of SQLite.

Post's attachments

Attachment icon Rank.zip 5.25 kb, 219 downloads since 2024-12-09 

Re: Место в конкурсе

sparrow wrote:

The query can be simplified by using new versions of SQLite.

Спасибо большое! А можете пояснить что такое t1.t, t2.t, rno

Re: Место в конкурсе

(SELECT id, name, p1, p2, p3, p4, (p1+p2+p3+p4) AS t FROM tbl) AS t1

формируется таблица t1 в которой имя поля t - сумма оценок (p1+p2+p3+p4) AS t


(
              WITH rank AS (SELECT p1+p2+p3+p4 t FROM tbl group by t)
              SELECT *, (SELECT count(*) FROM rank W WHERE W.t>=V.t) AS rno FROM rank V
            ) AS t2

формируется таблица t2 в которой имя поля t - ... p1+p2+p3+p4 AS t FROM tbl group by t ... уникальные суммы оценок
которым назначаются места в рейтинге SELECT *, (SELECT count(*) FROM rank W WHERE W.t>=V.t) AS rno.
Где имя поля rno

(SELECT count(*) FROM rank W WHERE W.t>=V.t) AS rno

и есть рейтинг.

А теперь по порядку.
1. Вычисляются уникальные суммы оценок бе повторений.
2. Каждой сумме присваивается рейтинг.
3. Объединяем с нашей основной таблицей t1 - (LEFT JOIN (... ) AS t2 ON t1.t=t2.t .В моем примере 8 учеников 8 сум( таблица (t1). Но 5 уникальных значений с рейтингом от 1 до 5 (таблица t2).  Каждому значению суммы оценок таблицы t1 подставляется рейтинг из таблицы t2.
4. Выводим нужные колонки в результат

Re: Место в конкурсе

Подумал и упростил


Все в вычисляемых полях.

Post's attachments

Attachment icon Rank mod.zip 5.1 kb, 223 downloads since 2024-12-09 

Re: Место в конкурсе

Привет, Vickus, Sparrow,
Мне нравится, как ты это делаешь с помощью вычисляемых полей — гораздо лаконичнее.
Я применил немного другой подход (см. вложение).
С уважением
Derek.

Post's attachments

Attachment icon ranking.zip 449.35 kb, 224 downloads since 2024-12-10 

Re: Место в конкурсе

Привет Дерек.
Да, это хорошее решение. Только нумерация странная ... . Я такую не встречал. Я внес небольшое изменение.
И мой и твой пример имеют некоторые недостатки.
В целом еще одно хорошее решение для рейтинга.


Hi Derek.
Yes, this is a good solution. Only the numbering is strange ... . I have not seen such. I made a small change.
Both my example and yours have some flaws.
Overall, another good solution for the ranking.

  for vi := 0 to form1.tablegrid1.RowCount-1 do
  begin
    if vi = 0 then form1.tablegrid1.cell[2,vi].asinteger := vi + 1 else
    if form1.tablegrid1.cells[1,vi] <> form1.tablegrid1.cells[1,vi-1] then
      form1.tablegrid1.cell[2,vi].asinteger := form1.tablegrid1.cell[2,vi - 1].asinteger + 1 else
        form1.tablegrid1.cell[2,vi].asinteger := form1.tablegrid1.cell[2,vi - 1].asinteger;
  end;

Re: Место в конкурсе

Hi Sparrow,
Да, я видел оба метода, используемые для ранжирования результатов

1, 2=, 2=, 2=, 5
1, 2=, 2=, 2=, 3

.
Я полагаю, что используемый метод зависит от обстоятельств.
Derek.

Re: Место в конкурсе

Yes, of course. You're right.

Re: Место в конкурсе

sparrow wrote:

Привет Дерек.
Да, это хорошее решение. Только нумерация странная ... . Я такую не встречал. Я внес небольшое изменение.
И мой и твой пример имеют некоторые недостатки.
В целом еще одно хорошее решение для рейтинга.


Hi Derek.
Yes, this is a good solution. Only the numbering is strange ... . I have not seen such. I made a small change.
Both my example and yours have some flaws.
Overall, another good solution for the ranking.

  for vi := 0 to form1.tablegrid1.RowCount-1 do
  begin
    if vi = 0 then form1.tablegrid1.cell[2,vi].asinteger := vi + 1 else
    if form1.tablegrid1.cells[1,vi] <> form1.tablegrid1.cells[1,vi-1] then
      form1.tablegrid1.cell[2,vi].asinteger := form1.tablegrid1.cell[2,vi - 1].asinteger + 1 else
        form1.tablegrid1.cell[2,vi].asinteger := form1.tablegrid1.cell[2,vi - 1].asinteger;
  end;

-------------------

Огромное спасибо за помощь и разъяснения!!!
Взял способ от Дерека.
Еще вопрос: подскажите, как вывести в отчет на бумаге все поля (Студент, его оценки и итоговое место)?
Еще раз огромное спасибо!!!

11 (edited by sparrow 2024-12-11 13:17:07)

Re: Место в конкурсе

)))


Вот мы и добрались до некоторых недостатков.
Для варианта Дерека варианта два.
1. Напрямую печатать таблицу на принтере. Мой пример печати сразу на принтер есть на форуме.
https://myvisualdatabase.com/forum/view … hp?id=9075
2. Передавать в FastReport и далее в скрипте FastReport обрабатывать используя один из примеров кода для скрипта ( Дерека или мой).
Конечно его надо подправить.
Есть еще момент для этого решения. Не пробуйте выводить часть ( выборку ) из списка, места будут неправильно подсчитаны.

12 (edited by sparrow 2024-12-11 13:00:57)

Re: Место в конкурсе

как то так

Post's attachments

Attachment icon ranking fr.zip 107.32 kb, 243 downloads since 2024-12-11 

Re: Место в конкурсе

sparrow wrote:

как то так

Большое спасибо за помощь! Все получилось