以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  分组统计优秀率  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=95205)

--  作者:刘林
--  发布时间:2017/1/13 8:28:00
--  分组统计优秀率
Dim g As New GroupTableBuilder("统计表1", DataTables("小生表"))
Dim dt1 As Table = Tables("期末_table6")
DataTables("师表").loadfilter = ""
DataTables("师表").load
g.Groups.AddDef("考试名称")
g.Groups.AddDef("学校")
g.Groups.AddDef("年级")
g.Groups.AddDef("类别")
g.Groups.AddDef("学校班级")
g.Totals.AddDef("姓名",AggregateEnum.Count,"参考数")
g.Totals.AddDef("语文",AggregateEnum.Average,"语文_人平")
g.Totals.AddDef("数学",AggregateEnum.Average,"数学_人平")
g.Totals.AddDef("英语",AggregateEnum.Average,"英语_人平")
g.Totals.AddDef("政治",AggregateEnum.Average,"政治_人平")
g.Totals.AddDef("历史",AggregateEnum.Average,"历史_人平")
g.Totals.AddDef("物理",AggregateEnum.Average,"物理_人平")
g.Totals.AddDef("化学",AggregateEnum.Average,"化学_人平")
g.Totals.AddDef("生物",AggregateEnum.Average,"生物_人平")
g.Totals.AddDef("地理",AggregateEnum.Average,"地理_人平")
g.Totals.AddDef("总分",AggregateEnum.Average,"总分_人平")
g.FromServer = True
dt1.DataSource = g.BuildDataSource()
dt1.DataTable.DataCols.Add("班级排名",Gettype(Integer))
dt1.DataTable.DataCols.Add("语文_教师",Gettype(String))
dt1.DataTable.DataCols.Add("数学_教师",Gettype(String))
dt1.DataTable.DataCols.Add("英语_教师",Gettype(String))
dt1.DataTable.DataCols.Add("政治_教师",Gettype(String))
dt1.DataTable.DataCols.Add("历史_教师",Gettype(String))
dt1.DataTable.DataCols.Add("物理_教师",Gettype(String))
dt1.DataTable.DataCols.Add("化学_教师",Gettype(String))
dt1.DataTable.DataCols.Add("生物_教师",Gettype(String))
dt1.DataTable.DataCols.Add("地理_教师",Gettype(String))
Dim ds As DataRow
For Each r As Row In Tables("期末_table6").Rows
    ds = DataTables("师表").Find("考试名称 = \'" & r("考试名称") & "\'and 学校班级 = \'" & r("学校班级") & "\'" )
    If ds IsNot Nothing
        r("语文_教师")= ds("语文教师")
        r("数学_教师")= ds("数学教师")
        r("英语_教师")= ds("英语教师")
        r("政治_教师")= ds("政治教师")
        r("历史_教师")= ds("历史教师")
        r("物理_教师")= ds("物理教师")
        r("化学_教师")= ds("化学教师")
        r("生物_教师")= ds("生物教师")
        r("地理_教师")= ds("地理教师")
        
    End If
Next

老师,请问我想增加个各科优秀率统计怎么加?如:语文优秀率,数学优秀率,当年级<7时85分为优秀,当年级>=7时80分为优秀

--  作者:有点蓝
--  发布时间:2017/1/13 9:03:00
--  
1、使用表达式列,类似

g.Totals.AddExp("语文优秀率","iif(年级<7 and 语文 > 85,\'优秀\',\'\')")

2、增加临时列,手工计算

--  作者:刘林
--  发布时间:2017/1/13 9:11:00
--  
请帮写个手工计算的例子,不是计算优秀,是在"期末_table6"中增加临时列来分组统计小生表中某个班的语文优秀率,请指教哪种方式效率最高,小生表中有几万条记录
--  作者:有点蓝
--  发布时间:2017/1/13 9:17:00
--  
手工计算:http://www.foxtable.com/webhelp/scr/0681.htm


至于效率,没有办法一概而论那种最高,根据你的逻辑,数据结构和数据实地测试过才知道

--  作者:有点色
--  发布时间:2017/1/13 9:18:00
--  

 

[此贴子已经被作者于2017/1/13 9:18:19编辑过]

--  作者:有点色
--  发布时间:2017/1/13 9:28:00
--  

增加列

 

dt1.DataTable.DataCols.Add("语文_优秀率",Gettype(String))

 

赋值

 

Dim yx As Integer = DataTables("小生表").Compute("count(语文)", "考试名称 = \'" & r("考试名称") & "\' and 年级 = \'" & r("年级") & "\' and 类别 = \'" & r("类别") & "\' and 年级班级 = \'" & r("年级班级") & "\' and 语文 >= " & iif(r("年级")>7,80,85))

Dim zrs As Integer = DataTables("小生表").Compute("count(语文)", "考试名称 = \'" & r("考试名称") & "\' and 年级 = \'" & r("年级") & "\' and 类别 = \'" & r("类别") & "\' and 年级班级 = \'" & r("年级班级") & "\'")

r("语文_优秀率") =  yx / zrs

[此贴子已经被作者于2017/1/13 9:28:57编辑过]

--  作者:刘林
--  发布时间:2017/1/13 9:52:00
--  
老师,上面代码有个实际问题,小生表记录太多不能全部加载,如果用sqlcompute,又很慢,只有看用2楼第一种办法,麻烦你再帮我写个第一个种方法人示例,谢谢
--  作者:有点色
--  发布时间:2017/1/13 10:19:00
--  

那你就用sqlGroupTableBuilder来统计。然后用表达式计算

 

g.Totals.AddExp("语文_优秀", "case when 年级<7 and 语文>=85 then 1 when 年级>=7 and 语文>=80 then 1 else 0 end")

g.Totals.AddDef("语文_总人数", AggregateEnum.Count)

 

生成表后加入表达式列

 

dt1.DataTable.DataCols.Add("语文_优秀率",Gettype(double),"语文_优秀 / 语文_总人数")

 

http://www.foxtable.com/webhelp/scr/1626.htm

 

 

[此贴子已经被作者于2017/1/13 12:33:42编辑过]

--  作者:刘林
--  发布时间:2017/1/13 10:42:00
--  
Dim g As New sqlGroupTableBuilder("统计表1", "小生表")
Dim dt1 As Table = Tables("期末_table6")
DataTables("师表").loadfilter = ""
DataTables("师表").load

g.Groups.AddDef("考试名称")
g.Groups.AddDef("学校")
g.Groups.AddDef("年级")
g.Groups.AddDef("类别")
g.Groups.AddDef("学校班级")
g.Totals.AddDef("姓名",AggregateEnum.Count,"参考数")
g.Totals.AddDef("语文",AggregateEnum.Average,"语文_人平")
g.Totals.AddDef("数学",AggregateEnum.Average,"数学_人平")
g.Totals.AddDef("英语",AggregateEnum.Average,"英语_人平")
g.Totals.AddDef("政治",AggregateEnum.Average,"政治_人平")
g.Totals.AddDef("历史",AggregateEnum.Average,"历史_人平")
g.Totals.AddDef("物理",AggregateEnum.Average,"物理_人平")
g.Totals.AddDef("化学",AggregateEnum.Average,"化学_人平")
g.Totals.AddDef("生物",AggregateEnum.Average,"生物_人平")
g.Totals.AddDef("地理",AggregateEnum.Average,"地理_人平")
g.Totals.AddDef("总分",AggregateEnum.Average,"总分_人平")
g.Totals.AddExp("语文_优数", "case when 年级<7 and 语文>=85 then 1 when 年级>=7 and 语文>=80 then 1 else 0 end", AggregateEnum.Count)
g.FromServer = True
dt1.DataSource = g.BuildDataSource()
dt1.DataTable.DataCols.Add("班级排名",Gettype(Integer))
dt1.DataTable.DataCols.Add("语文_教师",Gettype(String))
dt1.DataTable.DataCols.Add("数学_教师",Gettype(String))
dt1.DataTable.DataCols.Add("英语_教师",Gettype(String))
dt1.DataTable.DataCols.Add("政治_教师",Gettype(String))
dt1.DataTable.DataCols.Add("历史_教师",Gettype(String))
dt1.DataTable.DataCols.Add("物理_教师",Gettype(String))
dt1.DataTable.DataCols.Add("化学_教师",Gettype(String))
dt1.DataTable.DataCols.Add("生物_教师",Gettype(String))
dt1.DataTable.DataCols.Add("地理_教师",Gettype(String))
dt1.DataTable.DataCols.Add("语文_优秀率",Gettype(Double),"语文_优数 / 参考数")
 

Dim ds As DataRow
For Each r As Row In Tables("期末_table6").Rows
    ds = DataTables("师表").Find("考试名称 = \'" & r("考试名称") & "\'and 学校班级 = \'" & r("学校班级") & "\'" )    
    If ds IsNot Nothing
        r("语文_教师")= ds("语文教师")
        r("数学_教师")= ds("数学教师")
        r("英语_教师")= ds("英语教师")
        r("政治_教师")= ds("政治教师")
        r("历史_教师")= ds("历史教师")
        r("物理_教师")= ds("物理教师")
        r("化学_教师")= ds("化学教师")
        r("生物_教师")= ds("生物教师")
        r("地理_教师")= ds("地理教师")
    End If
Next

老师,我修改了下,出现错误生成的sql语句错误

--  作者:有点色
--  发布时间:2017/1/13 10:45:00
--  

这句去掉 g.FromServer = True