Rss & SiteMap

Foxtable(狐表) http://www.foxtable.com

新一代数据库软件,完美融合Access、Foxpro、Excel、vb.net之优势,人人都能掌握的快速软件开发工具!
共12 条记录, 每页显示 10 条, 页签: [1] [2]
[浏览完整版]

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

1楼
179635532 发表于:2011/5/22 10:06:00


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


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


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

 

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

2楼
狐狸爸爸 发表于:2011/5/22 10:17:00

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

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

 

[此贴子已经被作者于2011-5-22 10:17:06编辑过]
3楼
179635532 发表于:2011/5/22 10:33:00

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

 

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

4楼
179635532 发表于:2011/5/22 11:11:00
自己顶,继续求指教。
5楼
狐狸爸爸 发表于: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")

6楼
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 姓名;

7楼
狐狸爸爸 发表于:2011/5/22 11:30:00

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

 

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

[此贴子已经被作者于2011-5-22 11:31:40编辑过]
8楼
ybil 发表于:2011/5/23 8:18:00
多谢179635532朋友,太好了,要的就是它!
9楼
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编辑过]
10楼
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编辑过]
共12 条记录, 每页显示 10 条, 页签: [1] [2]

Copyright © 2000 - 2018 foxtable.com Tel: 4000-810-820 粤ICP备11091905号

Powered By Dvbbs Version 8.3.0
Processed in .03906 s, 3 queries.