6.5 对齐分组:每组保留所有匹配成员
按基准表中指定字段的顺序,将数据分组,每组保留所有匹配成员。适用于关心每组的成员信息,或者需要用这些成员记录继续进行统计的场景。
【例 1】 根据相互关联的员工表和部门表,按部门表中的部门顺序统计各部门人数。员工表和部门表的关系如下:
EMPLOYEE |
---|
ID |
NAME |
DEPT |
STATE |
… |
DEPARTMENT |
---|
NAME |
MANAGER |
… |
在 SPL 中函数 A.align() 的选项 @a,用于在对齐分组时每组保留所有匹配成员。
脚本:
A | |
---|---|
1 | =connect(“db”) |
2 | =A1.query(“select * from EMPLOYEE”) |
3 | =A1.query@x(“select * from DEPARTMENT”) |
4 | =A2.align@a(A3:DEPT, DEPT) |
5 | =A3.new(DEPT, A4(#).count():COUNT) |
A1:连接数据库。
A2:查询员工表。
A3:查询部门表。
A4:使用函数A.align@a ()将员工按部门对齐分组,其中选项@a 每组返回所有匹配成员。
A5:根据部门表创建结果序列,并通过 A4 对齐分组后的结果计算每组的数量,即每个部门的人数。
运行结果:
DEPT | COUNT |
---|---|
Administration | 4 |
Finance | 24 |
HR | 19 |
… | … |
对齐分组可能会有空组,也就是没有一个成员被分配到某个分组中。
【例 2】 根据相互关联的课程表和选课表,按课程表顺序查询各课程报名的人数。课程表与选课表的关系如下:
SelectCourse |
---|
ID |
CourseID |
StudentID |
… |
Course |
---|
ID |
Name |
TeacherID |
… |
脚本:
A | |
---|---|
1 | =connect(“db”) |
2 | =A1.query(“select * from SELECT_COURSE”) |
3 | =A1.query@x(“select * from COURSE”) |
4 | =A2.align@a(A3:ID,COURSEID) |
5 | =A3.new(ID, A4(#).len():COUNT) |
A1:连接数据库。
A2:查询选课表。
A3:查询课程表。
A4:使用函数A.align@a (),将选课表按照课程表的ID对齐,每组保留所有匹配成员。
对齐分组后的结果中可能会有空组,也就是有的课程没有学生选择:
成员 |
---|
[] |
[[13,2,7],[15,2,50],…] |
[[7,3,41],[11,3,5],…] |
[[45,4,28],[51,4,18],…] |
[[3,5,52],[4,5,44],…] |
… |
A5:根据课程表创建结果序列,并通过 A4 对齐分组后的结果计算每组的数量,即选择该课程的人数。
运行结果:
ID | COUNT |
---|---|
1 | 0 |
2 | 6 |
3 | 5 |
4 | 4 |
5 | 11 |
… | … |