3. 数据交叉
3.1 第一类(投影)交叉
〃 投影交叉:假定有一个查询SQL,其查询结果是单行单列的汇总值,另外还有两组WHERE条件的序列,分别为横向序列(WhereX1、WhereX2、……、WhereXn)和纵向序列(WhereY1、WhereY2、……、WhereYn),则数据矩阵A(aij)对应的结果集成为投影交叉,如果aij是WhereXi和WhereYj同时作用在上述SQL上获得的结果。
比如,某查询用于某公司下各部门各民族的人数,原始SQL(由查询向导生成的等效SQL)为:
select bd_deptdoc.deptname as deptname,
bd_defdoc.docname as docname,
count(bd_psndoc.pk_psndoc) as psnno
from bd_deptdoc
left outer join bd_psndoc on bd_deptdoc.pk_deptdoc= bd_psndoc.pk_deptdoc
left outer join bd_accpsndoc on bd_psndoc.pk_psndoc=bd_accpsndoc.pk_psndoc
left outer join bd_defdoc on bd_accpsndoc.nationality=bd_defdoc.pk_defdoc where bd_deptdoc.pk_corp = ?
group by bd_deptdoc.deptname, bd_defdoc.docname
查出的结果如下表所示:
图 3-15 原始数据(无交叉)
现在我们把查询字段中只保留人数count(bd_psndoc.psncode)一项,然后进行如下的投影交叉设置:
第 13 页
图 3-16 投影交叉设置
则交叉后的结果如下表所示:
图 3-17 投影交叉结果
3.2 第二类(旋转)交叉
〃 旋转交叉:此类交叉用于显示表中某几个字段(称为交叉值字段)的统计值,并将其分组放臵在查询结果中,一组列在数据表的左侧(称为交叉行字段),一组列(称为交叉列字段)旋转到数据表的上部成为列表头,统计值则放在对应的交叉单元。
关于旋转交叉的更细节的内容,请参考李媛媛所著的《交叉表使用说明》。
两类交叉的最大差别在于:第一类交叉属于查询行为,适用于行列设置都已在表样中固定的报表,其交叉结果严格遵循表样格式,其行列结构不会受查询数据的影响;第二类交叉属于数据加工行为,其交叉后的行列结构在查询出数据之前不可预料,多用于完全真实地对原始数据进行动态处理。
沿用3.1使用的例子,假定我们进行如下的旋转交叉设置(其中交叉砝码的意义是代表交叉值字段的位置,它只能出现在交叉行字段或交叉列字段当中):
第 14 页
图 3-18 旋转交叉设置
则交叉后的结果如下表所示:
图 3-19 旋转交叉结果
〃 在旋转交叉设臵界面上单击行,列,值标签(在图3-18中用蓝色框标示的位臵),可弹出交叉行列复合维度设臵和是否小计的设臵框。
第 15 页
图 3-20 旋转交叉结果(设置了小计)
4. 代码嵌入 4.1 SQL整理
〃 SQL整理(SQL Repair):指在SQL查询之前,对SQL所作的调整。通常会根据参数的不同,对查询的表、字段或条件等信息进行增补或修改。
SQL整理的具体内容由内嵌的代码片段描述(这与后面将介绍的数据加工和穿透规则一样),代码的录入可通过编码向导协助完成,尽管如此,这几种功能仍然推荐由高级实施人员或程序员使用。
第 16 页
图 3-21 SQL整理代码
在图示的SQL整理代码中,表达了这样一个整理愿望:当参数“detail”取值为“Y”时,引擎会在本查询对象已完成的SQL设计基础上多查询一张表(bd_defdoc)和两个字段(档案编码、档案名称),从而获得更明细的查询信息;如果该参数取值不为“Y”,则仍然按照SQL设计的定义去执行查询。
以下简单介绍几种SQL整理算法的编码向导使用方法:
(1) 追加查询表:参数为待追加的表物理名。
图 3-22 追加表向导
(2) 追加连接条件:与追加表同时使用,参数为连接模式、追加表物理名和追加的
表间连接条件。
第 17 页