数值分布统计的方法

统计数值的分布范围,是很常见的一种统计。

示例一

假定有下图所示的成绩表:

我们需要统计每一个科目的成绩分布范围,例如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语句代替,上一节已经用具体的例子说明了,这里就不再重复了。


本页地址:http://www.foxtable.com/webhelp/scr/2964.htm