以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=81635)

--  作者:9602084
--  发布时间:2016/3/2 15:04:00
--  [求助]
关于根据外部数据生成目录树问题:
总体思路:1、根据“目录树"表生成目录树,利用此表生成节点的name
2.根据”目录文本“表生成目录树的标题,利用此表生成节点的text
3.根据”测试表“统计各节点的人数。

方法一:先根据”目录树“和”目录文本“两个表生成目录树,再按节点的name统计各节点的人数
此方法耗时:84.85秒

方法二:1、在”测试表“增加四列,按级别奖编制号进行拆分
2.按拆分的字段进行分组统计,生成统计表
3.根据目录树和目录文本两个表生成目录树
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:速度测试.rar

4.根据节点name,在统计表中提取相应节点下的人数
此方法:0.56秒。

想问:在”测试表“不额外增加四个字段的情况,如何改进代码或完善表结构,让方法一的时间接近方法二的时间。

--  作者:大红袍
--  发布时间:2016/3/2 15:54:00
--  

方法一:你可以先生成一个查询表,然后再统计

 

select 一级,二级,三级,四级, count(*) as 人数 fr om (Select mid(编制号,1,4) As 一级, mid(编制号,5,4) As 二级, mid(编制号,9,4) As 三级, mid(编制号,13,4) As 四级  fr om {测试表}) group by 一级,二级,三级,四级

 

http://www.foxtable.com/help/topics/2329.htm

 

方法二:你可以一级一级的算,也就是在目录树那里,显示到哪一级,再生成节点和统计节点个数。

 


--  作者:大红袍
--  发布时间:2016/3/2 15:55:00
--  

查询表生成器 http://www.foxtable.com/help/topics/0695.htm

 


--  作者:9602084
--  发布时间:2016/3/2 16:18:00
--  [求助]
没看明白,如果”测试表"没有”一级、二级、三级、四级“四列怎么处理?
--  作者:大红袍
--  发布时间:2016/3/2 16:19:00
--  
认认真真看2楼,生成一个查询表,就有 一级、二级、三级、四级了啊,根据 编制号 生成的啊。
--  作者:9602084
--  发布时间:2016/3/2 16:31:00
--  [求助]
添加四列,用分组统计生成统计表
Dim dt As DataTable
Dim b As New SQLGroupTableBuilder("目录树用人员统计","基本信息")
b.C
b.Groups.AddDef("一级")
b.Groups.AddDef("二级")
b.Groups.AddDef("三级")
b.Groups.AddDef("四级")
b.Totals.AddDef("姓名",AggregateEnum.Count,"人数") \'根据客户列来统计记录数,也就是订单数
dt = b.Build(False)

生成统计表耗时:0.5540

用临时表生成统计表
Dim q As new QueryBuilder
q.TableName = "人数统计"
q.C
q.SelectString = "select 一级,二级,三级,四级, count(*) as 人数 fr om (Select mid(编制号,1,4) As 一级, mid(编制号,5,4) As 二级, mid(编制号,9,4) As 三级, mid(编制号,13,4) As 四级  fr om {测试表}) group by 一级,二级,三级,四级"
q.Build
生成统计表耗时:1.20407
耗时相差两倍还多。还能不能再优化一下?


--  作者:9602084
--  发布时间:2016/3/2 16:33:00
--  [求助]
对大红袍老师的耐心解答表示衷心感谢。
--  作者:大红袍
--  发布时间:2016/3/2 16:34:00
--  

 动态生成肯定慢,没办法。

 

 要不你就用方法二:显示到哪一级,就添加哪一级的节点。


--  作者:9602084
--  发布时间:2016/3/2 16:38:00
--  [求助]
再次对大红袍老师的热情解答表示衷心感谢!
--  作者:9602084
--  发布时间:2016/3/2 17:17:00
--  [求助]
又出问题了,
1.access数据源
Dim st As Date = Date.now
Dim q As new QueryBuilder
q.TableName = "人数统计"
q.C
q.SelectString = "select 一级,二级,三级,四级, count(*) as 人数 fr om (Select mid(编制号,1,4) As 一级, mid(编制号,5,4) As 二级, mid(编制号,9,4) As 三级, mid(编制号,13,4) As 四级  fr om {测试表}) group by 一级,二级,三级,四级"
q.Build
MainTable = Tables("人数统计")
MessageBox.show( "打开窗口用时:" & Format((Date.now - st).Totalseconds ,"0.00000") & "秒")
运行正常
2.sql数据源
Dim st As Date = Date.now
Dim q As new QueryBuilder
q.TableName = "目录树人数统计"
q.C
q.SelectString = "select 一级,二级,三级,四级, count(*) as 人数 fr om (Select mid(编制号,1,4) As 一级, mid(编制号,5,4) As 二级, mid(编制号,9,4) As 三级, mid(编制号,13,4) As 四级  fr om {基本信息}) group by 一级,二级,三级,四级"
q.Build
\'MainTable = Tables("人数统计")
MessageBox.show( "打开窗口用时:" & Format((Date.now - st).Totalseconds ,"0.00000") & "秒")
出错,提示:
图片点击可在新窗口打开查看此主题相关图片如下:qq图片20160302162348.png
图片点击可在新窗口打开查看