数值分布统计的方法
统计数值的分布范围,是很常见的一种统计。
示例一
假定有下图所示的成绩表:
我们需要统计每一个科目的成绩分布范围,例如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语句代替,上一节已经用具体的例子说明了,这里就不再重复了。