数值分布统计的方法
统计数值的分布范围,是很常见的一种统计。
示例一
假定有下图所示的成绩表:

我们需要统计每一个科目的成绩分布范围,例如60分以下,60分以上,70分以上等等范围的人数,以及各个科目的最高分、最低分、平均分等:

采用自定义表达式,可以方便地统计出来:
Dim
b As
New 
SQLGroupTableBuilder("统计表1","学生成绩")
b.Groups.AddDef("科目")
b.Totals.AddDef("分数",AggregateEnum.Max,"最高分")
b.Totals.AddDef("分数",AggregateEnum.Min,"最低分")
b.Totals.AddDef("分数",AggregateEnum.Average,"平均分")
b.Totals.AddExp("分布_60以下","iif(分数 
< 60,1,0)")
b.Totals.AddExp("分布_60-70","iif(分数 
>= 60 And 
分数 
< 70,1,0)")
b.Totals.AddExp("分布_70-80","iif(分数 
>= 70 And 
分数 
< 80,1,0)")
b.Totals.AddExp("分布_80-90","iif(分数 
>= 80 And 
分数 
< 90,1,0)")
b.Totals.AddExp("分布_90-100","iif(分数 
>= 90 And 
分数 
< 100,1,0)")
b.Totals.AddExp("分布_100-110","iif(分数 
>= 100 And 
分数 
< 110,1,0)")
b.Totals.AddExp("分布_110-120","iif(分数 
>= 110 And 
分数 
< 120,1,0)")
b.Totals.AddExp("分布_120-130","iif(分数 
>= 120 And 
分数 
< 130,1,0)")
b.Totals.AddExp("分布_130-140","iif(分数 
>= 130 And 分数 < 140,1,0)")
b.Totals.AddExp("分布_140以上","iif(分数 
>= 140,1,0)")
b.build()
MainTable =
Tables("统计表1")
示例二
本示例的内容涉及到SQL语句的知识,帮助文件《SQL相关》这章有具体介绍,如果好没有学习到SQL的知识,可以暂时忽略本示例。
实际上多数的原始成绩表,并非我们前面介绍的格式,而是下图这样的格式:

由于这个表本身是一个交叉表,用常规的统计工具我们无法直接得到下面的统计表,除非手工编码进行统计:

不过,如果我们能够通过SQL语句将原始成绩表转转为示例一的那种格式:

那么就可以直接用统计工具进行统计了,
关于这种转换,可以参考:水平表和垂直表的相互转换。
由于SQLGroupTableBuilder和SQLCrossTableBuilder,都可以直接对SQL语句进行统计,所以我们并不需要对转换后的表进行统计(这样会影响效率),只需将合成的SQL语句传递给SQLGroupTableBuilder即可,具体代码:
Dim
nms() As
String = {"语文","数学","英语","化学","物理"}
Dim
sql As
String 
For
Each nm
As String
In nms 
    
If sql  > ""
Then
        sql =
sql &
" Union All "
    End If
    sql = 
sql & 
"Select 
班级,姓名,'"
& nm
& 
"' As 
科目,"
& nm
& 
" As 
分数 
From {学生成绩}"
Next
Dim
b As
New 
SQLGroupTableBuilder("统计表1",sql,"")
b.Groups.AddDef("科目")
b.Totals.AddDef("分数",AggregateEnum.Max,"最高分")
b.Totals.AddDef("分数",AggregateEnum.Min,"最低分")
b.Totals.AddDef("分数",AggregateEnum.Average,"平均分")
b.Totals.AddExp("分布_60以下","iif(分数 
< 60,1,0)")
b.Totals.AddExp("分布_60-70","iif(分数 
>= 60 And 
分数 
< 70,1,0)")
b.Totals.AddExp("分布_70-80","iif(分数 
>= 70 And 
分数 
< 80,1,0)")
b.Totals.AddExp("分布_80-90","iif(分数 
>= 80 And 
分数 
< 90,1,0)")
b.Totals.AddExp("分布_90-100","iif(分数 
>= 90 And 
分数 
< 100,1,0)")
b.Totals.AddExp("分布_100-110","iif(分数 
>= 100 And 
分数 
< 110,1,0)")
b.Totals.AddExp("分布_110-120","iif(分数 
>= 110 And 
分数 
< 120,1,0)")
b.Totals.AddExp("分布_120-130","iif(分数 
>= 120 And 
分数 
< 130,1,0)")
b.Totals.AddExp("分布_130-140","iif(分数 
>= 130 And 分数 < 140,1,0)")
b.Totals.AddExp("分布_140以上","iif(分数 
>= 140,1,0)")
b.build()
MainTable =
Tables("统计表1")
提醒:SQL Server没有iif函数,需要用Case When语句代替,上一节已经用具体的例子说明了,这里就不再重复了。