灵活运用自定义表达式
由于SQLGroupTableBuilder和SQLCrossTableBuilder能自定义表达式,可以给我们的统计带来额外的灵活性。
提示:由于SQLGroupTableBuilder和SQLCrossTableBuilder是先转换成对应SQL语句,然后在后台数据库执行此SQL语句完成统计,所以其表达式采用的是SQL语法,且和使用的数据源有关。我们会在《SQL相关》这章对此进行专门的介绍。
示例一
例如有下图所示的一个名单表:
如果要得到每个小组已经签约和未签约数量,如下图:
用GroupTableBuilder是没有办法完成这样的统计的,但是用SQLGroupTableBuilder却很简单:
Dim
b As
New
SQLGroupTableBuilder("统计表1","名单")
b.Groups.Adddef("居民组")
b.Totals.Adddef("姓名",AggregateEnum.Count,"总人数")
b.Totals.Addexp("已签约","iif(签约期
Is null,0,1)")
b.Totals.Addexp("未签约","iif(签约期
Is null,1,0)")
b.Build
MainTable =
Tables("统计表1")
示例二
假定订单表的结构如下:
如果要分别统计出每个客户的已付款金额和未付款金额,以及总的金额:
同样只能用SQLGroupTableBuilder完成:
Dim
b As
New
SQLGroupTableBuilder("统计表1","订单")
b.Groups.Adddef("客户")
b.Totals.Addexp("已付款","iif(已付款
= True,数量 * 单价 * (1-折扣),0)")
b.Totals.Addexp("未付款","iif(已付款
<> True,数量 * 单价 * (1-折扣),0)")
b.Totals.Addexp("合计","数量
* 单价 * (1-折扣)")
b.Build()
MainTable =
Tables("统计表1")
需要注意的是,如果你的数据源是SQL Server,那么上面的代码是无法执行的,因为这是后台统计,采用的是后台数据源的函数,而SQL Server:
1、逻辑值不用False和True表示,用0和1表示。
2、没有iif函数,只能用Case When语句表示。
这些差异会在后面的《SQL相关》这一章介绍,目前可以有所了解。
基于上面的原因,如果是SQL Server数据源,代码需要改为:
Dim
b As
New
SQLGroupTableBuilder("统计表1","订单")
b.ConnectionName
= "数据源名称"
b.Groups.Adddef("客户")
b.Totals.Addexp("已付款",
"Case When
已付款 = 1 Then 数量 *
单价 * (1-折扣) Else 0
End")
b.Totals.Addexp("未付款",
"Case When
已付款 <> 1 Then 数量 *
单价 * (1-折扣) Else 0
End")
b.Totals.Addexp("合计","数量
* 单价 * (1-折扣)")
b.Build()
MainTable =
Tables("统计表1")
关于SQL Server和Access的语法差异,帮助文件《SQL相关》这一章会有较为详细的介绍。