SQLCrossTableBuilder
用于对后台数据进行交叉统计。
定义一个SQLCrossTableBuilder的语法如下:
New SQLCrossTableBuilder(TableName, BaseTable)
参数说明:
TableName
字符型,指定即将生成的统计表的名称
BaseTable
字符型,指定默认的要统计的数据表,简称为基表
可以是未加载的数据表,只要数据源存在此表即可。
在定义SQLCrossTableBuilder的时候,只能指定一个统计表,也就是基表。
如果要同时针对多个表进行统计,可以使用AddTable方法添加表,参与统计的表相互之间必须存在某种联系。
添加统计表的语法为:
AddTable(LeftTable ,LeftCol, RightTable, RightCol)
LeftTable: 基表,或者已经添加的数据表,称之为左表。
LeftCol: 左表通过此列和右表关联。
RightTable:要添加的关联表,称之为右表。
RightCol: 右表通过此列和左表关联。
提示:
1、左表(LeftTable)和右表(Table2)并非一定要事先建立关联,只需两者的数据可以通过指定的列关联起来即可。
3、如果两个表存在一对多的父子关系,那么建议将多方(子表)作为左表,一方(父表)作为右表。
3、参与统计的表可以是未加载的数据表,只要数据源存在此表即可。
例如:
Dim s
g As New SQLCrossTableBuilder("统计表1","订单明细")表示基表是订单明细,此外添加产品表参与统计,产品表和订单明细通过产品ID列关联。
由于产品表和订单表是一对多的父子关系,所以用AddTable添加表的时候,订单表(子表)作为左表,产品表(父表)作为右表。
如果要根据多列关联,请参考:
Dim
b As New SQLCrossTableBuilder("统计表1","产品")上面的代码,产品表作为基表,添加订单表参与统计,两个表之间通过型号、规格两列建立关联。
SQLCrossTableBuilder包括以下属性:
ConnectionName | 指定数据源名称,如果省略,表示使用内部数据表。 |
Caption | 字符型,指定新生成统计表的标题。 |
HGroups | 集合,用于添加水平分组列。 |
VGroups | 集合,用于添加垂直分组列。 |
Totals | 集合,用于添加统计列。 |
OrderByTotal | 逻辑型,在有多个统计列时,是否将同一个统计列的数据排放在一起。 |
HorizontalTotal | 水平方向自动汇总。 |
VerticalTotal | 垂直方向自动汇总。 |
Subtotal | 逻辑型,设为True,将对交叉统计结果进行二次统计,生成汇总模式。 |
Decimals | 整数型,用于设置统计结果要保留的小数位数。 |
HorizontalProportion | 逻辑型,是否生成水平份额 |
VerticalProportion | 逻辑型,是否生成垂直占比 |
HorizontalProportionCaption | 字符型,用于设置水平份额标题,默认为“份额” |
VerticalProportionCaption | 字符型,用于设置垂直占比标题,默认为“占比” |
SamePeriodGrowth | 逻辑型,是否生成同比增长率。 |
CircleGrowth | 逻辑型,是否生成环比增长率。 |
Filter | 字符型,设置统计条件。 |
CommandTimeOut | 整数型,用于设置统计后台数据的超时时限,默认为30秒,一般不需要设置此属性,除非需要进行非常耗时超过30秒的统计,以至于出现超时错误,此时可适当地加大CommandTimeOut属性的值。 |
添加水平分组到HGroups的语法是:
HGroups.AddDef(Name)
HGroups.AddDef(Name, NewName)
HGroups.AddDef(Name, NewName, NewCaption)
HGroups.AddDef(Name, DateGroup)
HGroups.AddDef(Name, DateGroup, NewName)
HGroups.AddDef(Name, DateGroup, NewName, NewCaption)
参数说明
Name: 字符型,指定分组列。
NewName: 字符型,用于给分组列指定一个新的名称,这个名称在统计表中显示。
NewCaption: 字符型,用于给分组列设置标题。
DateGroup: DateGroupEnum型枚举,如果分组列是日期列,可用此属性指定如何根据日期进行分组,默认按月分组。
DateGroupEnum枚举的可选值:
None : 不分组
Year: 按年分组
Quarter: 按季度分组
Month: 按月分组
Week: 按周分组
Day: 按天分组,月中的某一天。
Hour: 按小时分组
Minute: 按分钟分组 Second: 按秒分组
可以向HGroups增加表达式分组列,语法为:
HGroups.AddExp(Name,
Expression)
HGroups.AddExp(Name,
Expression,Caption)
参数说明:
Name:
字符型,指定列名。
Expression: 字符型,指定表达式。
Caption: 字符型,指定标题。
添加垂直分组到VGroups中的语法如下:
VGroups.AddDef(Name)
VGroups.AddDef(Name, Pattern)
VGroups.AddDef(Name, DateGroup)
VGroups.AddDef(Name, DateGroup, Pattern)
参数说明
Name: 字符型,指定分组列。
Pattern: 指定生成标题的模式,用字符"{0}"表示分组值;假定分组值是10,模式是"第{0}周",生成的分组标题将是"第10周"。
DateGroup:DateGroupEnum枚举型,如果分组列是日期列,可用此属性指定如何根据日期进行分组,默认按月分组。
可以向VGroups增加表达式分组列,语法为:
VGroups.AddExp(Name,
Expression)
VGroups.AddExp(Name,
Expression,Pattern)
参数说明:
Name:
字符型,指定列名。
Expression:字符型,指定表达式。
Pattern: 指定生成标题的模式,用字符"{0}"表示分组值;假定分组值是10,模式是"第{0}周",生成的分组标题将是"第10周"
添加统计列到Totals集合中的语法是:
Totals.AddDef(Name)
Totals.AddDef(Name, Caption)
Totals.AddDef(Name, Aggregate)
Totals.AddDef(Name, Aggregate,Caption)
参数说明
Name: 字符型,指定统计列。
Caption: 字符型,指定统计列的标题。
Aggregate: AggregateEnum枚举型,用于指定统计类型,默认是求和。
AggregateEnum型枚举的可选值:
Average:平均值
Count: 记录数
Max: 最大值
Min: 最小值
Sum: 累积值
在Exprs添加一个表达式统计列的语法是:
Totals.AddExp(Name, Expression)
Totals.AddExp(Name, Expression, Caption)
Totals.AddExp(Name, Expression, Aggregate)
Totals.AddExp(Name, Expression, Caption, Aggregate)
Name: 字符型,指定列名。
Expression:字符型,指定表达式。
Caption: 字符型,指定列标题。
Aggregate: AggregateEnum枚举型,用于指定统计类型,默认是求和。
例如:
Dim
b As New SQLCrossTableBuilder("统计表1","订单")可以看出SQLCrossTableBuilder和CrossTableBuilder的使用方法基本相似,前者只是在后者的基础上增加了:
1、可以用ConnectionName指定数据源
2、可以用AddTable方法增加多个数据表
3、可以用AddExp方法增加表达式分组列或统计列
提示:由于SQLCrossTableBuilder是根据用户的设置,自动生成SQL语句进行统计, 所以添加表或列时,名称必须和后台数据库保持一致,此外条件表达式的语法和函数与采用的数据源有关,我们会在《SQL相关》这章对此进行专门的介绍。
统计单个数据表
在运行下面的示例之前,请打开CaseStudy目录下的文件:统计演示.Table
示例一
普通的统计,SQLCrossTableBuilder和CrossTableBuilder的用法基本一样。
例如统计同一客户订购不同产品的数量:
Dim
b As New SQLCrossTableBuilder("统计表1","订单")生成的统计结果:
示例二
SQLCrossTableBuilder可以添加表达式统计列,例如:
Dim
b As New SQLCrossTableBuilder("统计表1","订单")
示例三
不仅是统计列,水平分组列和垂直分组列也可以是表达式:
Dim b As New SQLCrossTableBuilder("统计表1","订单")
b.HGroups.AddExp("月", "Month(日期)")
b.VGroups.AddExp("年", "Year(日期)")
b.Totals.AddDef("数量")
b.Totals.AddExp("金额","数量 * 单价") '
b.Build
MainTable = Tables("统计表1")
注意这两行代码:
b.HGroups.AddExp("月", "Month(日期)")
b.VGroups.AddExp("年", "Year(日期)")
等效于:
b.HGroups.AddDef("日期",DateGroupEnum.Month,"月")
b.VGroups.AddDef("日期",DateGroupEnum.Year)
统计多个数据表
在运行下面的示例之前,请打开CaseStudy目录下的文件:多表统计.Table
这个文件的所有表都来自外部数据源,外部数据源的名称为Sale,外部数据源是一个Access文件:多表统计.mdb
整个系统包括三个表,分别是客户、产品和订单:
示例一
假定要统计同一客户订购不同产品的数量,由于订单表没有产品名称和客户名称列,如果只根据订单表生成统计表,只能显示产品ID和客户ID,显然这样的统计表太不友好了,毕竟没有人会记得每个ID对应的
具体名称是什么。
所以我们需要从产品表提取产品名称,从客户表提取客户名称列:
Dim
b As New SQLCrossTableBuilder("统计表1","订单")生成的统计结果:
在使用外部数据源的时候,一定要记得设置ConnectionName属性:
b.ConnectionName = "数据源名称"
示例二
例如要按年统计同一客户订购不同产品的数量:
Dim
b As New SQLCrossTableBuilder("统计表1","订单")生成的统计结果:
示例三
SQLCrossTableBuilder同样可以生成汇总模式,只需将Subtotal属性设置为True即可,例如:
Dim b As New SQLCrossTableBuilder("统计表1","订单")
b.ConnectionName = "Sale"
b.AddTable("订单","产品ID","产品","产品ID") '添加统计表
b.AddTable("订单","客户ID","客户","客户ID") '添加统计表
b.HGroups.AddDef("日期",DateGroupEnum.Year,"年") '添加日期列用于垂直分组,按年分组
b.HGroups.AddDef("产品名称") '添加产品列用于垂直分组
b.VGroups.AddDef("客户名称","客户_{0}") '添加客户列用于水平分组
b.Totals.AddDef("数量") '添加数量列用于统计
b.Subtotal = True '生成汇总模式
b.Build '生成统计表
MainTable = Tables("统计表1") '打开生成的统计表
得到的统计结果为:
示例四
SQLCrossTableBuilder同样可以进行垂直占比和水平份额的分析:
Dim
b As New SQLCrossTableBuilder("统计表1","订单")生成的统计结果:
示例五
SQLCrossTableBuilder同样可以同比和环比统计,例如:
Dim b As New SQLCrossTableBuilder("统计表1","订单")
b.ConnectionName = "Sale"
b.AddTable("订单","产品ID","产品","产品ID")
b.AddTable("订单","客户ID","客户","客户ID")
b.HGroups.AddDef("日期", DateGroupEnum.Year, "年")
b.HGroups.AddDef("日期", DateGroupEnum.Month,"月")
b.VGroups.AddDef("产品名称","{0}_数量")
b.Totals.AddDef("数量")
b.SamePeriodGrowth = True '生成同比
b.CircleGrowth = True '生成环比
b.Build()
MainTable = Tables("统计表1")
生成的统计结果: