Как получить количество строк из другой таблицы?

У меня есть таблица (таблица 1) со списком студентов от высшего до самого низкого класса. Я хочу разделить их на 3 группы. Но сколько учеников в каждой группе? Сначала я подсчитываю, сколько у меня учеников, затем смотрю в таблице 1 строку, в которой находится столбец. NumberStudent равно общему количеству студентов, если я нашел. Я беру число group1, которое означает количество студентов в group1. Студент не должен повторяться в других группах.

Таблица 2
содержит сколько студентов в каждой группе в соответствии с их количеством

-------------------------------------------
 NumberStudent| group1 | group2 | group3 |
 -----------------------------------------
       1      |    1   |   0    |   0    |  
       2      |    2   |   0    |   0    |
       3      |    2   |   1    |   0    |
       4      |    2   |   2    |   0    |
       5      |    2   |   2    |   1    |
 -----------------------------------------
  • Для 5 студентов группа 1 = 2 студента, группа 2 = 2 студента и группа 3 = 1 студент
  • Для 3 учеников группа 1 = 2 ученика, группа 2 = 1 ученик и группа 3 = 0 учеников

Таблица 1

+----+----------+------------+
| id | name     | Marks      | 
+----+----------+------------+
|  1 | Bertrand | 17         | 
|  2 | Charles  | 10         |
|  3 | Alex     | 12         | 
|  4 | David    | 11         | 
|  5 | Eric     | 20         | 
|  6 | François | 20         |
|  7 | Gaston   | 18         | 
|  8 | Henri    | 20         | 
+----+----------+------------+

Я хочу посчитать, сколько студентов в таблице 1

select count(Id) as Total from Table1

Например, если у меня 5 учеников, я делю их на 3 группы в соответствии с номером таблицы2.

Таблица 2

NumberStudent| group1 | group2 | group3 |
-----------------------------------------
      5      |    2   |   2    |   1    |

У меня 2 студента в группе 1, 2 студента в группе 2, 1 студент в группе 3

select name,Marks from Table1 
where Marks >=10
order by Marks row //from table2 (how can i obtain the number row =2 as parameter ) 

В группе 2 есть 2 ученика, которых нет в группе 1

select name,Marks from Table1 
where Marks >=15 and id<> id // the student in groupe2 not mention in group1
order by Marks  rowrow //from table1 (group2 for 5 student is 2 so row =2) 

В группе 3 есть 1 ученик, которого нет в группе 1

select name,Marks from Table1 
where Marks >17 and id<> id // the student in groupe3 not mention in group1 and group2
order by Marks row row //from table1 (group3 for 5 student is 1 so row =1) 

Результат должен быть

  1  Henri     20    group1      
  2  Eric      20    group1        
  3  François  20    group2            
  4  Gaston    18    group2           
  5  Bertrand  17    group3 

1 ответ

Если я правильно понимаю, вы хотите разделить студентов на группы и студентов с самым высоким Marks должны идти в первую группу и т. д. и студенты с самым низким Marks в последней группе? Вы, кажется, используете Table2 по существу, искать размеры групп, но почему бы просто не рассчитать их?

Я бы использовал отбор для оценки всех студентов по Marks и затем разделите этот номер ранка на размер группы, которая была нарушена, чтобы сгенерировать номера групп.

Я не совсем уверен в правильном синтаксисе Firebird (здесь нет Firebird 3.0), но что-то вроде этого:

declare @MyGroupSize double;
set @MyGroupSize = 5.0;

select
    floor(a.RANKNO / @MyGroupSize) as GROUPNO,
    (a.RANKNO / @MyGroupSize) as TEST123,
    a.RANKNO,
    a.id,
    a.name,
    a.Marks
from
    (
        SELECT
            row_number() over(order by Marks DESC)-1 as RANKNO,
            id,
            name,
            Marks
        FROM
            Students
    ) a
Другие вопросы по тегам