Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
请问狐表该如何操作或如何写代码实现?
可以的,之前论坛就做过一个这样的例子。
你自己搞不定的话,做个表,输几行数据,传上来,我帮你写下代码
在命令窗口执行下面的代码看看:
Dim dtb As New DataTableBuilder("表2")
dtb.AddDef("姓名", Gettype(String), 32)
For Each v As String In DataTables("学生成绩表").GetUniqueValues("","课程")
dtb.AddDef(v, Gettype(Double))
Next
dtb.Build()
For Each v As String In DataTables("学生成绩表").GetUniqueValues("","姓名")
Dim dr1 As DataRow = DataTables("表2").AddNew()
dr1("姓名") = v
For Each dr2 As DataRow In DataTables("学生成绩表").DataRows
If dr2("姓名") = v Then
dr1(dr2("课程")) = dr2("分数")
End If
Next
Next
MainTable = Tables("表2")
谢谢狐狸爸爸!
另外刚在网上找到一句在JET中实现静态行转列的SQL语句,贴在下面与狐友分享,用编程方式组合一下字符串,应该也能实现动态行转列。
SELECT 姓名,
max(iif( 课程 = '语文' , 分数 , 0) ) AS 语文,
max(iif( 课程 = '数学' , 分数 , 0) ) AS 数学,
max(iif( 课程 = '物理' , 分数 , 0) ) AS 物理
FROM {学生成绩表}
GROUP BY 姓名;
呵呵,还是你这段厉害,不过我的通用性强点,不管多少个科目,科目名称怎样,都不需要改代码。
SQLCrossTableBuilder--统计多个数据表
在运行下面的示例之前,请打开CaseStudy目录下的文件:统计演示.Table
Dim b As New
SQLCrossTableBuilder("统计表1","订单")
b.ConnectionName = "Sale"
b.AddTable("订单","产品ID","产品","产品ID") '添加统计表
b.AddTable("订单","客户ID","客户","客户ID") '添加统计表
b.AddCols("产品","产品名称") '指定产品名称列来自产品表
b.AddCols("客户","客户名称") '指定客户名称列来自客户表
b.HGroups.AddDef("客户名称") '添加客户列用于水平分组
b.VGroups.AddDef("产品名称","产品名称_{0}") '添加产品列用于垂直分组,并设置了Pattern参数
b.Totals.AddDef("数量") '添加数量列用于统计
b.Build '生成统计表
Maintable = Tables("统计表1") '打开生成的统计表