以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 行排序问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=147061) |
||||
-- 作者:透明人生 -- 发布时间:2020/3/8 23:42:00 -- 行排序问题 动态生成临时表,按列学科排序,是否能按下图所示排序(列中有多行语文或数学或别的学科): 论坛中有提到辅助列,只能是对应行数,如:出现多行语文学科,问题是学科行数不能确定的(比如三行语文,五行英语或不确定行)。
[此贴子已经被作者于2020/3/9 0:23:12编辑过]
|
||||
-- 作者:程兴刚 -- 发布时间:2020/3/9 5:39:00 -- 增加辅助列,用1234567或ABCDEF来给各学科指定编码!弄一个编码表自动输入到辅助列即可! |
||||
-- 作者:透明人生 -- 发布时间:2020/3/9 12:31:00 -- 哪儿有实例参考吗? |
||||
-- 作者:程兴刚 -- 发布时间:2020/3/9 13:05:00 -- 发文件上来! |
||||
-- 作者:透明人生 -- 发布时间:2020/3/9 14:27:00 -- 按钮代码: Dim b As New SQLGroupTableBuilder("成绩汇总表","中心小学统考成绩表") b.C b.FIlter = DataTables("中心小学统考成绩表").loadFIlter If Tables("中心小学统考成绩表").FIlter > "" Then b.FIlter = IIF(b.FIlter > "", b.FIlter & " and ","") & Tables("中心小学统考成绩表").FIlter End If b.Groups.AddDef("学校") b.Groups.AddDef("年级") b.Groups.AddDef("班级") b.Groups.AddDef("学科") b.Groups.AddDef("单元") b.Groups.AddDef("教师") b.Totals.AddExp("人数","分数","",AggregateEnum.Count) \'统计人数 b.Totals.AddExp("分数分布_50以下","Case When 分数 < 50 Then 1 else 0 End") b.Totals.AddExp("分数分布_60-50","Case When 分数 >= 50 And 分数 < 60 Then 1 else 0 End") b.Totals.AddExp("分数分布_70-60","Case When 分数 >= 60 And 分数 < 70 Then 1 else 0 End") b.Totals.AddExp("分数分布_80-70","Case When 分数 >= 70 And 分数 < 80 Then 1 else 0 End") b.Totals.AddExp("分数分布_85-80","Case When 分数 >= 80 And 分数 < 85 Then 1 else 0 End") b.Totals.AddExp("分数分布_90-85","Case When 分数 >= 85 And 分数 < 90 Then 1 else 0 End") b.Totals.AddExp("分数分布_100-90","Case When 分数 >= 90 And 分数 < 100 Then 1 else 0 End") b.Totals.AddExp("合格","Case When 分数 >= 60 Then 1 else 0 End") b.Totals.AddExp("优秀","Case When 年级 = \'一年级\' And 分数 >= 90 or 年级 = \'二年级\' And 分数 >= 90 or 年级 = \'三年级\' And 分数 >= 85 or 年级 = \'四年级\' And 分数 >= 85 or 年级 = \'五年级\' And 分数 >= 80 or 年级 = \'六年级\' And 分数 >= 80 Then 1 Else 0 End" ) b.Totals.AddDef("分数",AggregateEnum.Max,"最高分") b.Totals.AddDef("分数",AggregateEnum.Min,"最低分") b.Totals.AddDef("分数",AggregateEnum.sum,"总分") b.VerticalTotal = True b.build() DataTables("成绩汇总表").DataCols.Add("优秀率", Gettype(Double), "[优秀] / [人数]*100") DataTables("成绩汇总表").DataCols.Add("合格率", Gettype(Double), "[合格] / [人数]*100") DataTables("成绩汇总表").DataCols.Add("平均分", Gettype(Double), "[总分] / [人数]") DataTables("成绩汇总表").DataCols.Add("排名_平均分", Gettype(Double)) DataTables("成绩汇总表").DataCols.Add("排名_优秀率", Gettype(Double)) DataTables("成绩汇总表").DataCols.Add("超过总平均人数", Gettype(Double)) MainTable = Tables("成绩汇总表") Tables("成绩汇总表").SetColVisibleWidth("学校|85|年级|60|班级|40|学科|40|单元|40|人数|40|分数分布_100-90|45|分数分布_90-85|40|分数分布_85-80|40|分数分布_80-70|40|分数分布_70-60|40|分数分布_60-50|40|分数分布_50以下|50|最高分|40|最低分|40|总分|60|平均分|50|合格率|50|优秀率|50|超过总平均人数|50|排名_平均分|45|排名_优秀率|45|教师|60") \'按顺序设置宽度,别的隐藏 Dim bjs As List(Of String()) = DataTables("成绩汇总表").GetValues("年级|学科|班级") \'如果要按年级(即学校)排名,不能出现"班级" For Each bj As String() In bjs \'获得该班级的全部行,按总分降序排序 Dim drs As List(Of DataRow) = DataTables("成绩汇总表").Select("[年级] = \'" & bj(0) & "\'", "平均分 DESC") For n As Integer = 0 To drs.Count - 1 \'遍历所有行 If n > 0 AndAlso drs(n)("平均分") = drs(n-1)("平均分") Then \'如果总分和上一行相同 drs(n)("排名_平均分") = drs(n-1)("排名_平均分") \'则排名等于上一行 Else drs(n)("排名_平均分") = n + 1 \'设置排名 End If Next Next Dim njs As List(Of String()) = DataTables("成绩汇总表").GetValues("年级|学科|班级") \'如果要按年级(即学校)排名,不能出现"班级" For Each nj As String() In njs \'获得该班级的全部行,按总分降序排序 Dim drss As List(Of DataRow) = DataTables("成绩汇总表").Select("[年级] = \'" & nj(0) & "\'", "优秀率 DESC") For m As Integer = 0 To drss.Count - 1 \'遍历所有行 If m > 0 AndAlso drss(m)("优秀率") = drss(m-1)("优秀率") Then \'如果总分和上一行相同 drss(m)("排名_优秀率") = drss(m-1)("排名_优秀率") \'则排名等于上一行 Else drss(m)("排名_优秀率") = m + 1 \'设置排名 End If Next Next For Each m As Row In Tables("成绩汇总表").rows For Each r As Row In Tables("成绩汇总表").rows Dim rs As Integer = DataTables("中心小学统考成绩表").compute("count(分数)","[学校] = \'" & r("学校") & "\'And [年级] = \'" & r("年级") & "\' And [班级] = \'" & r("班级") & "\' And [学科] = \'" & r("学科") & "\' And [单元] = \'" & r("单元") & "\'and 分数 >= " & m("平均分") ) r("超过总平均人数") = rs Next Next 生成后的:()在这个汇总表中,按语数英排序,所有语文,所有数学、所有英语,这样排序。) |
||||
-- 作者:有点蓝 -- 发布时间:2020/3/9 14:59:00 -- 添加一个辅助列,遍历所有行,如果是学科是语文辅助列就设置为1,数学辅助列设置为2,..... |
||||
-- 作者:透明人生 -- 发布时间:2020/3/9 17:44:00 -- 备注行与学科行数量不对应,也不在同一行。 Dim xks As List(Of String) xks = DataTables("成绩汇总表").GetValues("学科") For Each xk As String In xks Dim dr2 As DataRow = DataTables("成绩汇总表").AddNew() If xk = "语文" Then dr2("备注") = 1 Else If xk = "数学" Then dr2("备注") = 2 Else dr2("备注") = 3 End If End If Next
|
||||
-- 作者:有点蓝 -- 发布时间:2020/3/9 20:34:00 -- for each r as row in Tables("成绩汇总表").rows dim xk = r("学科") If xk = "语文" Then r("备注") = 1 Else If xk = "数学" Then r("备注") = 2 Else r("备注") = 3 End If next |
||||
-- 作者:程兴刚 -- 发布时间:2020/3/9 23:51:00 --
想排序时,用辅助列排序,调整字符串各学科的位置关系即可以实现自定义排序,自己参考着用!
|