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 |
| … | … |
