第 5 章 数据行列转换
5.1 课程科目转为列头
一般情形下,不同专业的学生课程是动态的,不适合设计为列名。但展现为报表时,人们更习惯看到表头为课程。如图为打开 scores 的学生成绩表:

现在看下如何将课程列里面的课程转换为列名。
第一步: 在 scores 表上,单击行列转换按钮:

第二步: 在行列转换界面上如图设置红框属性,其中字段列设置为 SUBJECT ,意思是将课程列里面的各科目转换为字段名,数据列为 SCORE ,分组字段设为 STUDENT ,按照学生姓名分组:

单击OK后,成绩表就转换成了每位同学一行,科目在列头的交叉成绩表:

5.2 科目从列头转为数据行
科目在列头的表,方便人们查看,登记成绩,但有时候也需要将这类成绩登记表,反向转换为数据库方便存储的格式。
跟 5.1 节步骤一样,在 pivotScore 表上仍然点击行列转换,在红框处设置转换后表名,其他属性跟行转列一样,唯一不同就是要勾选上由列转行复选框:

单击OK后,便将当前科目又重新转换为数据行了:

SPL WIN 的步骤有记忆功能,所以在列传行时,字段列以及数据列都沿用了上一步的设置,但其实由列转行时,字段列和数据列的名称一般是要新创建的列名,需要手动输入。
5.3 课程科目转为行式延展表
编辑打印每位同学的成绩单时,交叉式成绩表就没那么方便了,此时想要将每位同学的各科目以及成绩,都延展列在同一行上,打印成绩单时就不需要过多重复编辑科目内容了。
步骤同 5.1,只是后续属性有些微差异,在 pivotReverse 表上,单击行列转换按钮后,基本设置跟 5.1 节相同,注意不同红框属性:

其中转换类型(Table type)选择延展表,单击OK后,得到按课程延展后的转换表:

5.4 延展表转为数据行
同样地,延展式的表,也能转换为行式。
在 extendScore 表中,单击行列转换按钮后,基本设置跟 5.2 节相同,注意不同红框属性:

同样地,选上由列转行复选框,注意设置好字段列和数据列的名称,以及设置对应的转换类型表为延展表,单击OK后,同样得到数据行式的成绩表:

5.5 人口普查表
人口普查时,户籍民警会入户调查,按照小区各家庭进行常住人口登记,为了登记方便,所有家庭成员是顺序,连续登记的。登记的示例表格如打开的 CensusRecord 表:

如图所示,在关系( Relation )列中,每个家庭都由不定行构成,分别为首行的户主( Head )及其后续所有成员组成。显然,要打印每个家庭的花名册时,需要将每个家庭中的所有数据行,转换为一行数据,才方便以家庭为单位处理。
现在要将上述登记表,转换为每个家庭占一行的延展表,先尝试按 Relation 分组,示例属性设置如图:

单击OK后,得到转换结果:

查看上图红框中数据,转换结果不是期望类型。原因是按 Relation 分组后,转换的结果并没有错,它是将所有相同 Relation 划分到一组了。
按常规列名分组,结果不对时。可以尝试表达式分组,想办法将顺序的家庭成员分到同一组。每个家庭都只有一个户主( Head ),那么使用表达式判断每行的 Relation 是否为户主( Head ),是的话计数为 1,否则计数 0,再按计数累计值分组,这样每个家庭成员就会位于相同的累计组。
重新在 CensusRecord 上使用表达式cum(if(Relation=="Head",1,0)):Num设置转换:

现在的转换结果为:

可以看到已经将所有户主( Head )转为对应的 1 列,其他成员位于后续列中。
知识点:cum 是累积函数,使用 cum 函数后就不需要像前面章节介绍的引用邻值再累加。详细用法请参考:https://d.raqsoft.com.cn:6443/esproc/func/cum.html
