Как получить количество строк из другой таблицы? - PullRequest
0 голосов
/ 10 декабря 2018

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

table2
содержит, сколько студентов в каждой группе в соответствии с их числом

-------------------------------------------
 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 студентов group1 = 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 Ответ

0 голосов
/ 13 декабря 2018

Если я правильно понимаю, вы хотите разделить студентов на группы, и студенты с самым высоким 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
...