以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]请问狐表现在有“行转列”的功能吗?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=10118)

--  作者:179635532
--  发布时间:2011/5/22 10:06:00
--  [求助]请问狐表现在有“行转列”的功能吗?


问题:假设有张学生成绩表(tb)如下:


姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94


想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------

 

请问狐表该如何操作或如何写代码实现?


--  作者:狐狸爸爸
--  发布时间:2011/5/22 10:17:00
--  

可以的,之前论坛就做过一个这样的例子。

你自己搞不定的话,做个表,输几行数据,传上来,我帮你写下代码

 

[此贴子已经被作者于2011-5-22 10:17:06编辑过]

--  作者:179635532
--  发布时间:2011/5/22 10:33:00
--  

先谢谢狐狸爸爸指教了!图片点击可在新窗口打开查看

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:行转列求助.zip


--  作者:179635532
--  发布时间:2011/5/22 11:11:00
--  
自己顶,继续求指教。
--  作者:狐狸爸爸
--  发布时间:2011/5/22 11:14:00
--  

在命令窗口执行下面的代码看看:

 

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")


--  作者:179635532
--  发布时间:2011/5/22 11:26:00
--  

谢谢狐狸爸爸!

 

另外刚在网上找到一句在JET中实现静态行转列的SQL语句,贴在下面与狐友分享,用编程方式组合一下字符串,应该也能实现动态行转列。

 

SELECT 姓名,
max(iif( 课程 = \'语文\' , 分数 , 0) ) AS 语文,
max(iif( 课程 = \'数学\' , 分数 , 0) ) AS 数学,
max(iif( 课程 = \'物理\' , 分数 , 0) ) AS 物理
FROM {学生成绩表}
GROUP BY 姓名;


--  作者:狐狸爸爸
--  发布时间:2011/5/22 11:30:00
--  

呵呵,还是你这段厉害,不过我的通用性强点,不管多少个科目,科目名称怎样,都不需要改代码。

 

图片点击可在新窗口打开查看

[此贴子已经被作者于2011-5-22 11:31:40编辑过]

--  作者:ybil
--  发布时间:2011/5/23 8:18:00
--  
多谢179635532朋友,太好了,要的就是它!
--  作者:ybil
--  发布时间:2011/5/23 8:24:00
--  
引用狐狸爸爸 011-5-22 11:31:40的发言:

呵呵,还是你这段厉害,不过我的通用性强点,不管多少个科目,科目名称怎样,都不需要改代码。


嘻嘻,学习6楼的方法,来个动态通用的:

Dim  s1,s2 As String
For Each s1 In DataTables("成绩库").GetUniqueValues("","课程")
    s2 = s2  & ",max(iif( 课程 = \'" & s1 &"\',分数 , 0)) AS " & s1
Next
s2 = "SELECT 姓名 " & s2 & " FROM {成绩库} GROUP BY 姓名"
Tables("窗口1_Table1").Fill(s2,True)

[此贴子已经被作者于2011-5-23 8:31:32编辑过]

--  作者:ybil
--  发布时间:2011/5/23 8:29:00
--  

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") \'打开生成的统计表


SQL与 FoxTable结合法:

Dim  s As String
Dim Arys As List(Of String()) 
Arys = DataTables("产品").GetUniqueValues("", "产品ID","产品名称")
For Each Ary As String() In Arys   
    s = s & ",Sum(iif( 产品ID = \'" & Ary(0) &"\',数量 ,0)) As 产品_" & Ary(1)
Next
s= "SELECT 客户ID As 客户" & s & " FROM {订单} GROUP BY 客户ID"
Tables("窗口1_Table2").Fill(s,"Sale",True)

For Each dr  As DataRow In DataTables("窗口1_Table2").DataRows
    dr("客户") = DataTables("客户").Find("客户ID = \'" & dr("客户") & "\'")("客户名称")
Next
[此贴子已经被作者于2011-5-23 8:37:02编辑过]