我有一张表格(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 |
-----------------------------------------
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
答案 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