以文本方式查看主题

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

--  作者:chnfo
--  发布时间:2018/6/21 16:50:00
--  [求助]combine的问题

Dim bd1 As New SQLGroupTableBuilder("统计表1","进货单")
Dim
dt1 As fxDataSource
bd1.Groups.AddDef(
"型号") \'根据型号分组
bd1
.Totals.AddDef("数量","进货_数量") \'对数量进行统计
bd1
.Totals.AddExp("进货_金额","数量 * 单价") \'对金额进行统计

bd1.filter = "月份=201801“    ‘只统计2018年1月的单子
dt1
= bd1.BuildDataSource()

Dim
bd2 As New SQLGroupTableBuilder("统计表2","销售单")
Dim
dt2 As fxDataSource
bd2.Groups.AddDef(
"型号") \'根据型号分组
bd2
.Totals.AddDef("数量","销售_数量") \'对数量进行统计
bd2.Totals.AddExp(
"销售_金额","数量 * 售价") \'对金额进行统计

bd2.filter = 月份=201801"
dt2
= bd2.BuildDataSource()


dt1.Combine("型号",dt2,"型号") \'将销售统计数据组合到进货统计数据

dt1.Combine("型号",dt3,"型号") \'将退货统计数据组合到进货统计数据
dt1
.Show("统计表1") \'显示统计结果

问题是:bd1中假设有100种商品,但bd2中可能有120种。

如何只出现bd1中的100种商品?

[此贴子已经被作者于2018/6/21 16:50:04编辑过]

--  作者:有点甜
--  发布时间:2018/6/21 17:03:00
--  

方法一:用sql语句处理 inner join 或者 left join

 

方法二:在你得到的结果后,进行一下筛选,设置统计表1的 型号 in (表A的型号)


--  作者:chnfo
--  发布时间:2018/6/21 17:04:00
--  
1、SQL当然好了
2、数据量大的情况下,用in的效率实在是不行呀
[此贴子已经被作者于2018/6/21 17:04:59编辑过]

--  作者:有点甜
--  发布时间:2018/6/21 17:34:00
--  
那就自己写sql语句实现功能呗,你是不会写还是怎样?只有这种方法效率最高。
--  作者:chnfo
--  发布时间:2018/6/21 17:41:00
--  
SQL倒是可以,ACCESS可以自己生成的。直接在ACCESS中拖拉即可。
但是有些功能,依赖SQL效率不高啊。比如数据量大,而且要用like的话,那还真是不行。

--  作者:有点甜
--  发布时间:2018/6/21 17:47:00
--  

1、SQLGroupTableBuilder也是动态合成sql语句执行而已,和你自己写sql语句没有什么区别。

 

2、sql效率是否高,取决于你对语句的优化,以及,你数据库表结构的优化。


--  作者:有点甜
--  发布时间:2018/6/21 17:48:00
--  
既然like效率不高,那就想办法不要用like,绕开它。
--  作者:chnfo
--  发布时间:2018/6/21 18:05:00
--  
http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=120462
这个帖子里,使用like去找上级节点直至顶级,数据量小的时候,速度很快,但是如果WL表的数据行数达到几千行的时候,执行就会其慢无比。

--  作者:有点甜
--  发布时间:2018/6/21 18:23:00
--  
效率低的例子做一个发上来测试。

--  作者:chnfo
--  发布时间:2018/6/22 0:10:00
--  
本来数据比这个多,截掉了一部分
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试输出20180616.zip