Foxtable(狐表)用户栏目专家坐堂 → 行排序问题


  共有2429人关注过本帖树形打印复制链接

主题:行排序问题

帅哥哟,离线,有人找我吗?
透明人生
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:223 积分:1738 威望:0 精华:0 注册:2019/10/19 23:00:00
行排序问题  发帖心情 Post By:2020/3/8 23:42:00 [只看该作者]

动态生成临时表,按列学科排序,是否能按下图所示排序(列中有多行语文或数学或别的学科):

图片点击可在新窗口打开查看此主题相关图片如下:学科.png
图片点击可在新窗口打开查看
论坛中有提到辅助列,只能是对应行数,如:出现多行语文学科,问题是学科行数不能确定的(比如三行语文,五行英语或不确定行)。

[此贴子已经被作者于2020/3/9 0:23:12编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7237 积分:40614 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2020/3/9 5:39:00 [只看该作者]

增加辅助列,用1234567或ABCDEF来给各学科指定编码!弄一个编码表自动输入到辅助列即可!

 回到顶部
帅哥哟,离线,有人找我吗?
透明人生
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:223 积分:1738 威望:0 精华:0 注册:2019/10/19 23:00:00
  发帖心情 Post By:2020/3/9 12:31:00 [只看该作者]

哪儿有实例参考吗?

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7237 积分:40614 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2020/3/9 13:05:00 [只看该作者]

发文件上来!

 回到顶部
帅哥哟,离线,有人找我吗?
透明人生
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:223 积分:1738 威望:0 精华:0 注册:2019/10/19 23:00:00
  发帖心情 Post By: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

生成后的:()在这个汇总表中,按语数英排序,所有语文,所有数学、所有英语,这样排序。)


图片点击可在新窗口打开查看此主题相关图片如下:汇总表.png
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107873 积分:548728 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/9 14:59:00 [只看该作者]

添加一个辅助列,遍历所有行,如果是学科是语文辅助列就设置为1,数学辅助列设置为2,.....

 回到顶部
帅哥哟,离线,有人找我吗?
透明人生
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:223 积分:1738 威望:0 精华:0 注册:2019/10/19 23:00:00
  发帖心情 Post By:2020/3/9 17:44:00 [只看该作者]

备注行与学科行数量不对应,也不在同一行。

图片点击可在新窗口打开查看此主题相关图片如下:结果.png
图片点击可在新窗口打开查看

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107873 积分:548728 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7237 积分:40614 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2020/3/9 23:51:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目36.table


想排序时,用辅助列排序,调整字符串各学科的位置关系即可以实现自定义排序,自己参考着用!

 回到顶部