SQLCrossTableBuilder

用于对后台数据进行交叉统计。

定义一个SQLCrossTableBuilder的语法如下: 

 

New SQLCrossTableBuilder(TableName, BaseTable)

 

参数说明:

在定义SQLCrossTableBuilder的时候,只能指定一个统计表,也就是基表。

如果要同时针对多个表进行统计,可以使用AddTable方法添加表,参与统计的表相互之间必须存在某种联系。

 

添加统计表的语法为:

AddTable(LeftTable ,LeftCol, RightTable, RightCol)


LeftTable: 基表,或者已经添加的数据表,称之为左表。
LeftCol:   左表通过此列和右表关联。
RightTable:要添加的关联表,称之为右表。
RightCol:  右表通过此列和左表关联。


提示:

1、左表(LeftTable)和右表(Table2)并非一定要事先建立关联,只需两者的数据可以通过指定的列关联起来即可。

3、如果两个表存在一对多的父子关系,那么建议将多方(子表)作为左表,一方(父表)作为右表。
3、参与统计的表可以是未加载的数据表,只要数据源存在此表即可。

 

例如:

Dim sg As New SQLCrossTableBuilder("统计表1","订单明细")
sg.AddTable(
"订单明细","产品ID","产品","产品ID")

表示基表是订单明细,此外添加产品表参与统计,产品表和订单明细通过产品ID列关联。
由于产品表和订单表是一对多的父子关系,所以用AddTable添加表的时候,订单表(子表)作为左表,产品表(父表)作为右表。

如果要根据多列关联,请参考:

Dim b As New SQLCrossTableBuilder("统计表1","产品")
Dim
Cols1() As String = {"型号","规格"}
Dim
Cols2() As String = {"型号","规格"}
b.AddTable(
"产品",Cols1,"订单"
,Cols2)

上面的代码,产品表作为基表,添加订单表参与统计,两个表之间通过型号、规格两列建立关联。

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","订单")
b.Exprs.Adddef(
"金额","[数量] * [单价] * (1-[折扣])"
)

可以看出SQLCrossTableBuilder和CrossTableBuilder的使用方法基本相似,前者只是在后者的基础上增加了:

1、可以用ConnectionName指定数据源
2、可以用AddTable方法增加多个数据表
3、可以用AddExp方法增加表达式分组列或统计列

提示:由于SQLCrossTableBuilder是根据用户的设置,自动生成SQL语句进行统计, 所以添加表或列时,名称必须和后台数据库保持一致,此外条件表达式的语法和函数与采用的数据源有关,我们会在《SQL相关》这章对此进行专门的介绍。

统计单个数据表

在运行下面的示例之前,请打开CaseStudy目录下的文件:统计演示.Table

示例一

普通的统计,SQLCrossTableBuilder和CrossTableBuilder的用法基本一样。
例如统计同一客户订购不同产品的数量:

Dim b As New SQLCrossTableBuilder("统计表1","订单")
b.HGroups.AddDef(
"客户") '添加客户列用于水平分组
b.VGroups.AddDef(
"产品","产品_{0}") '添加产品列用于垂直分组,并设置了Pattern参数
b.Totals.AddDef(
"数量") '添加数量列用于统计
b.Build
'生成统计表
Maintable = Tables(
"统计表1")
'打开生成的统计表

生成的统计结果:

示例二

SQLCrossTableBuilder可以添加表达式统计列,例如:

Dim b As New SQLCrossTableBuilder("统计表1","订单")
b.HGroups.AddDef(
"客户")
b.VGroups.AddDef(
"产品")
b.Totals.AddDef(
"数量")
b.Totals.AddExp(
"金额","数量 * 单价 * (1 - 折扣)") '
b.Build

Maintable = Tables(
"统计表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","订单")
b.ConnectionName =
"Sale"
b.AddTable(
"订单","产品ID","产品","产品ID") '添加统计表
b.AddTable(
"订单","客户ID","客户","客户ID") '添加统计表
b.HGroups.AddDef(
"客户名称") '添加客户列用于水平分组
b.VGroups.AddDef(
"产品名称","产品名称_{0}") '添加产品列用于垂直分组,并设置了Pattern参数
b.Totals.AddDef(
"数量") '添加数量列用于统计
b.Build
'生成统计表
Maintable
= Tables("统计表1") '打开生成的统计表

生成的统计结果:

在使用外部数据源的时候,一定要记得设置ConnectionName属性:

b.ConnectionName = "数据源名称"

示例二

例如要按年统计同一客户订购不同产品的数量:

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.Build
'生成统计表
Maintable
= Tables("统计表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","订单")
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.HorizontalProportion =
True '生成水平份额
b.Build
'生成统计表
Maintable
= Tables("统计表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")

生成的统计结果:


本页地址:http://www.foxtable.com/webhelp/topics/1627.htm