总是有人问这个问题,所以帮助增加一节,将各种情况总结一下:
示例一
假定表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语句设置为:
[此贴子已经被作者于2015/5/20 10:42:32编辑过]