Как получить количество строк из другой таблицы?
У меня есть таблица (таблица 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