Foxtable(狐表)用户栏目专家坐堂 → [求助]请问狐表现在有“行转列”的功能吗?


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

主题:[求助]请问狐表现在有“行转列”的功能吗?

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


加好友 发短信
等级:婴狐 帖子:12 积分:183 威望:0 精华:0 注册:2011/5/6 20:57:00
[求助]请问狐表现在有“行转列”的功能吗?  发帖心情 Post By:2011/5/22 10:06:00 [只看该作者]


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


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


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

 

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


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/5/22 10:17:00 [只看该作者]

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

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

 

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

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


加好友 发短信
等级:婴狐 帖子:12 积分:183 威望:0 精华:0 注册:2011/5/6 20:57:00
  发帖心情 Post By:2011/5/22 10:33:00 [只看该作者]

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

 

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


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


加好友 发短信
等级:婴狐 帖子:12 积分:183 威望:0 精华:0 注册:2011/5/6 20:57:00
  发帖心情 Post By:2011/5/22 11:11:00 [只看该作者]

自己顶,继续求指教。

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:12 积分:183 威望:0 精华:0 注册:2011/5/6 20:57:00
  发帖心情 Post By:2011/5/22 11:26:00 [只看该作者]

谢谢狐狸爸爸!

 

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

 

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


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/5/22 11:30:00 [只看该作者]

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

 

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

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

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


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/5/23 8:18:00 [只看该作者]

多谢179635532朋友,太好了,要的就是它!

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


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By: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编辑过]

 回到顶部
总数 12 1 2 下一页