如何从另一个表中获取行数?

时间:2018-12-10 16:27:49

标签: sql firebird firebird-3.0

我有一张表格(table1),其中列出了从最高年级到最低年级的学生。我想将它们分为3组。但是每组有多少学生?首先,我计算我有多少学生,然后在表1中查找第NumberStudent列等于学生总数的行(如果找到)。我用group1的数字表示组1中的学生人数。该学生不应在其他组中重复学习。

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个学生,第1组= 2个学生,第2组= 2个学生,第3组= 1个学生
  • 对于3个学生,第1组= 2个学生,第2组= 1个学生,第3组= 0个学生

table1

+----+----------+------------+
| 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个学生,我会根据Table2的数量将他们分为3组。

表2

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

我第1组有2个学生,第2组有2个学生,第3组有1个学生

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 :(得分:0)

如果我的理解正确,您想将学生分成几组,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