灵活运用自定义表达式

由于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相关》这一章会有较为详细的介绍。


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