Foxtable(狐表)用户栏目专家坐堂 → 水平表和垂直表的转换


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

主题:水平表和垂直表的转换

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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
水平表和垂直表的转换  发帖心情 Post By:2015/5/20 10:33:00 [只看该作者]

总是有人问这个问题,所以帮助增加一节,将各种情况总结一下:

示例一

假定表A的结构如下:


此主题相关图片如下:1546.gif
按此在新窗口浏览图片
 
希望将其转换为表B,结构为:


此主题相关图片如下:1547.gif
按此在新窗口浏览图片

转换代码为:

 

Dim dtb As New DataTableBuilder("表B")
dtb.AddDef("姓名", Gettype(String), 32)
For Each v As String In DataTables("表A").GetValues("课程")
    dtb.AddDef(v, Gettype(Double))
Next
dtb.Build()
For Each v As String In DataTables("表A").GetValues("姓名")
    Dim dr1 As DataRow = DataTables("表B").AddNew()
    dr1("姓名") = v
    For Each dr2 As DataRow In DataTables("表A").Select("姓名 = '" & v & "'")
       dr1(dr2("课程")) = dr2("分数")
    Next
Next
MainTable = Tables("表B")

 

我们也可以用交叉统计来完成,代码会更加简洁:

 

Dim g As New CrossTableBuilder("表B", DataTables("表A"))
g.HGroups.AddDef("姓名")
g.VGroups.AddDef("课程")
g.Totals.AddDef("分数")
g.Build()
MainTable = Tables("表B")

 

两个方法生成的表看起来是一样的,不过利用查看表结构功能,你可以看到二者的差别,所以根据需要选择方法吧。


示例二

接下来更复杂点,假定有下图所示的学生成绩表,在上面的基础上多了一个科目列:


此主题相关图片如下:2000.png
按此在新窗口浏览图片

需要将其转换为水平结构的表,而且在原有科目的基础上,再增加一个总分列:


此主题相关图片如下:0346.gif
按此在新窗口浏览图片

可以参考下面的代码:

Dim dtb As New DataTableBuilder("表B")
dtb.AddDef("班级",Gettype(String),10)
dtb.AddDef("姓名",Gettype(String),10)
For Each v As String In DataTables("学生成绩").GetValues("科目")
    dtb.AddDef(v, Gettype(Double))
Next
dtb.Build()
For Each v As String() In DataTables("学生成绩").GetValues("班级|姓名")
    Dim dr1 As DataRow = DataTables("表B").AddNew()
    dr1("班级") = v(0)
    dr1("姓名") = v(1)
    For Each dr2 As DataRow In DataTables ("学生成绩").Select("班级 = '" & v(0) & "' And 姓名 = '" & v(1) & "'")
        dr1(dr2("科目")) = dr2("分数")
    Next
Next
DataTables("表B").DataCols.Add("总分",Gettype(Double),"[语文] + [英语] + [数学] + [物理] + [化学]")
MainTable = Tables("表B")

当然,我们同样也可以直接用交叉统计实现:

Dim g As New CrossTableBuilder("统计表1", DataTables("学生成绩"))
g.HGroups.AddDef("班级")
g.HGroups.AddDef("姓名")
g.VGroups.AddDef("科目")
g.Totals.AddDef("分数")
g.Build()
DataTables("统计表1").DataCols.Add("总分",Gettype(Double),"[分数_1] + [分数_2] + [分数_3] + [分数_4] + [分数_5]")
MainTable = Tables("统计表1")

你可能会疑问,总分列的表达式为啥不是:[语文] + [英语] + [数学] + [物理] + [化学]。
你可以选择生成的统计表,利用查看表结构功能查看一下统计表的结构,就知道怎么回事了。

示例三
 
现在反过来,假定有个水平结构的表:


此主题相关图片如下:0346.gif
按此在新窗口浏览图片
需要转换为垂直结构的表:


此主题相关图片如下:2000.png
按此在新窗口浏览图片

我们可以新建一个查询表,或者用QueryBuilder,将其Sel ect语句设置为:

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:abc.txt



 
[此贴子已经被作者于2015/5/20 10:42:32编辑过]

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


加好友 发短信
等级:七尾狐 帖子:1629 积分:14396 威望:0 精华:0 注册:2014/6/6 8:42:00
  发帖心情 Post By:2015/8/12 9:33:00 [只看该作者]

谢谢!

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


加好友 发短信
等级:七尾狐 帖子:1629 积分:14396 威望:0 精华:0 注册:2014/6/6 8:42:00
  发帖心情 Post By:2015/8/12 15:47:00 [只看该作者]

狐爸好!如何转换成数据表而不是临时表呢?谢谢!

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/8/12 15:54:00 [只看该作者]

以下是引用zcgmxf在2015/8/12 15:47:00的发言:
狐爸好!如何转换成数据表而不是临时表呢?谢谢!

 

参考 http://www.foxtable.com/help/topics/2122.htm

 


 回到顶部