在表中,参数为维的函数,且返回维与原维不同时,称为层函数。
所谓假表,就是虚表中实际不存在的单字段表。在DQL中引入假表的概念,主要是为了解决两类问题:
第一类通过定义维的各个层次结构,使用户能够在不同的粒度上观察数据。
通过假表与层函数的配合使用,我们能够定义类似于,年、年月、日期,这样的日期层次,从而使用户获得能够在不同时间粒度上观察数据的能力,同样的,我们也能够定义国家、省、市这样的结构,这取决于具体的业务规范,对于这种结构,在元数据编辑设计器中都可以一次定义,到处使用。
对于层次结构的定义,通常有几个维度就定义几张表(或假表)。比如上述的日期,一般就定义年、年月、日这样三张表。如果业务表中的日期字段存储的是日信息,就让它指向“日”表,如果是年月信息,则指向“年月”表,依次类推。
在元数据定义中,当表间的外键关系设定之后,会根据外键设定中,产生的维信息,自动生成维的相关定义。然后可以在元数据的维和层页面里,定义这几个维度间的计算关系。
举例:
日期维中定义层函数,比如demo.glmd中通过Day、Year、YearMonth三张假表定义的日期层次:
说明:
1) 在层间计算式中用?表示源字段表
,表示“Year”维年字段的值可以由“YearMonth”维的年月字段通过表达式int(?/100)换算而来。
2) 层间计算式也可以说成从细向粗计算。比如“Day”维,只能从日算出年,不能从年算出日。
3) 目标维可分别通过多个源维进行换算。比如“Year”维,可能是从日聚集到年,也可能从年月聚集到年,因此,对于“Year”维,就要定义两个层间计算式,分别从“Day”表的日期和“YearMonth”表的年月计算而来。
4) 定义好这种结构之后,我们就可以在DQL中直接使用定义中的任何结构,如下例:
在ReturnedPmt表中Date是个日期类型,在ReturnedPmt表的外键定义中,我们将“ReturnedPmt”表的字段Date与“Day”表的字段Day建立外键关系,如下图:
这样,我们就可以在DQL中获得Date的年,月等信息了,如Date#Year,得到Date的年份,Date#YearMonth就得到了Date的年月
DQL: SELECT CustomerID,ID,Date,Date#YearMonth YearMonth,Date#Year Year,Amount,SellerID FROM ReturnedPmt
DQL: SELECT sum(Amount) Sum_Amount ON Year FROM ReturnedPmt by Date#Year
DQL: SELECT sum(Amount) Sum_Amount ON YearMonth FROM ReturnedPmt by Date#YearMonth
举例:
整数维中定义层函数,比如demo.glmd中通过Province、Area、City表定义的层次:
DQL查询语句及结果:
DQL: SELECT CustID,CustName,Contact,ContactTitle,CityCode,CityCode#Province Province,CityCode#Area Area FROM Customer
DQL: SELECT count(CustID) CustNumber ON Area FROM Customer BY CityCode#Area
DQL: SELECT count(CustID) CustNumber ON Province FROM Customer BY CityCode#Province
第二类可以充当数据库视图,这种情况下,可以把假表视为表来使用,可以为其定义主键、外键等属性,在用户眼中和表是相同的。
知识点:
有了假表和层函数等概念,用户就可以按照希望的层次来观察数据,并且用户也可以更灵活的使用数据。