以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 水平表和垂直表的转换 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=68546) |
-- 作者:狐狸爸爸 -- 发布时间:2015/5/20 10:33:00 -- 水平表和垂直表的转换 总是有人问这个问题,所以帮助增加一节,将各种情况总结一下:
示例一
假定表A的结构如下:
希望将其转换为表B,结构为:
转换代码为:
Dim dtb As New DataTableBuilder("表B")
我们也可以用交叉统计来完成,代码会更加简洁:
Dim g As New CrossTableBuilder("表B", DataTables("表A"))
两个方法生成的表看起来是一样的,不过利用查看表结构功能,你可以看到二者的差别,所以根据需要选择方法吧。 示例二
接下来更复杂点,假定有下图所示的学生成绩表,在上面的基础上多了一个科目列:
需要将其转换为水平结构的表,而且在原有科目的基础上,再增加一个总分列:
可以参考下面的代码: 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")
你可能会疑问,总分列的表达式为啥不是:[语文] + [英语] + [数学] + [物理] + [化学]。
你可以选择生成的统计表,利用查看表结构功能查看一下统计表的结构,就知道怎么回事了。
示例三
现在反过来,假定有个水平结构的表:
需要转换为垂直结构的表:
我们可以新建一个查询表,或者用QueryBuilder,将其Sel ect语句设置为:
[此贴子已经被作者于2015/5/20 10:42:32编辑过]
|
-- 作者:zcgmxf -- 发布时间:2015/8/12 9:33:00 -- 谢谢! |
-- 作者:zcgmxf -- 发布时间:2015/8/12 15:47:00 -- 狐爸好!如何转换成数据表而不是临时表呢?谢谢! |
-- 作者:大红袍 -- 发布时间:2015/8/12 15:54:00 -- 以下是引用zcgmxf在2015/8/12 15:47:00的发言:
狐爸好!如何转换成数据表而不是临时表呢?谢谢!
参考 http://www.foxtable.com/help/topics/2122.htm
|