Foxtable(狐表)用户栏目专家坐堂 → [求助]这个多表查询代码怎么写?


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

主题:[求助]这个多表查询代码怎么写?

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/8/16 22:30:00 [显示全部帖子]

 在命令窗口里运行下面的代码便可。

Dim otherdt As String = "日历|其他表"
Dim sqlstr As String = ""
For Each dt As DataTable In DataTables
    If dt.Caption IsNot Nothing AndAlso otherdt.Contains(dt.Caption) = False AndAlso otherdt.Contains(dt.Name) = False Then
        sqlstr += "select '" & dt.Caption & "' As 股piao, 时间, CDbl(left(涨幅, len(涨幅)-1)) as 涨幅 from {" & dt.Name & "}"
        sqlstr += " union "
    End If
Next
sqlstr = sqlstr.SubString(0, sqlstr.Length - 7)
sqlstr = "select * from (" & sqlstr & ") As t1 left join {日历} as t2 on (t1.时间=t2.公历年月日)"

Dim q As new QueryBuilder
q.TableName = "股piao汇总"
q.SelectString = sqlstr
q.Build
MainTable = Tables("股piao汇总")

'---------------
Dim g As New CrossTableBuilder("统计表1", DataTables("股piao汇总"))
g.HGroups.AddDef("星期")
g.VGroups.AddDef("股piao")
g.Totals.AddDef("涨幅", AggregateEnum.Average, "涨幅")
g.Build()
MainTable = Tables("统计表1")

'-----------------
g = New CrossTableBuilder("统计表2", DataTables("股piao汇总"))
g.HGroups.AddDef("农历日")
g.VGroups.AddDef("股piao")
g.Totals.AddDef("涨幅", AggregateEnum.Average, "涨幅")
g.Build()
MainTable = Tables("统计表2")


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/8/17 20:15:00 [显示全部帖子]

2楼的代码有点问题,生成临时表 股piao汇总 的时候,有些数据被吞噬了。下面的代码才正确。

Dim otherdt As String = "日历|表列管理|股piao信息明细表|代码对照表|股piao汇总|统计表1|统计表2"
Dim sqlstr As String = ""
For Each dt As DataTable In DataTables
    If dt.Caption IsNot Nothing AndAlso otherdt.Contains(dt.Caption) = False AndAlso otherdt.Contains(dt.Name) = False Then
        sqlstr += "select '" & dt.Caption & "' As 股piao, 时间, CDbl(left(涨幅, len(涨幅)-1)) as 涨幅 from {" & dt.Name & "}"
        sqlstr += " union "
    End If
Next
sqlstr = sqlstr.SubString(0, sqlstr.Length - 7)
Output.Show(sqlstr)
sqlstr = "select * from (" & sqlstr & ") As t1 left join {日历} as t2 on (t1.时间=t2.公历年月日)"
Dim cmd As New SQLCommand
Dim sdt As DataTable
cmd.CommandText = sqlstr
sdt = cmd.ExecuteReader()

'---------------
Dim g As New CrossTableBuilder("统计表1", sdt)
g.HGroups.AddDef("星期")
g.VGroups.AddDef("股piao")
g.Totals.AddDef("涨幅", AggregateEnum.Average, "涨幅")
g.Build()
MainTable = Tables("统计表1")

'-----------------
g = New CrossTableBuilder("统计表2", sdt)
g.HGroups.AddDef("农历日")
g.VGroups.AddDef("股piao")
g.Totals.AddDef("涨幅", AggregateEnum.Average, "涨幅")
g.Build()
MainTable = Tables("统计表2")

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/8/17 20:19:00 [显示全部帖子]

以下是引用jyh7081在2013-8-17 10:43:00的发言:
我想达到如下效果:                     
                     分析1、对各只股piao星期*的平均涨幅进行分析时,增加多年选择;(数据取 平均值、众数、中数 可选)
                     分析2、对各只股piao阴历*的平均涨幅进行分析时,增加多年选择;(数据取 平均值、众数、中数 可选)
                     分析1、2中的多年选择不要求一致,能否不生成临时表,因为下一步还要对其引用分析。例子文件在4楼
                     下面是我在execl中运用数据透视表进行分析的截图:
[此贴子已经被作者于2013-8-17 10:58:56编辑过]


楼主,这些你自己参考来做吧。筛选年份的话,不难做到,给sqlstr加一个条件就行了。

求众数和中数也不难做。你自己看看帮助文档,先入门,自食其力吧。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/8/17 21:06:00 [显示全部帖子]

 代码  Dim otherdt As String = "日历|表列管理|股piao信息明细表|代码对照表|股piao汇总|统计表1|统计表2" ”为何出现 “股piao汇总”
 只是不想操作无关的股piao表,有没有股piao汇总不关事。

 周六,周日,是有数据的,具体你可以看看生成的sql结果。
 在代码里加入output.show(sqlstr)可以在命令窗口输出sql语句,然后执行看结果

 如果要加入筛选年份的条件,可以在sql语句的最后加入 比如: xxxxx where (时间 >= #1991/01/01# and 时间 < #1992/01/01) or (时间 >= #1999/01/01# and 时间 < #2000/01/01)

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/8/17 22:21:00 [显示全部帖子]

以下是引用逛逛在2013-8-17 22:19:00的发言:

最好能自定义年、月的起止,因为很多财务核算周期不是从1号开始计算的。

 


这个确实是,如果能够定义月的起止,就真的很实用。

 回到顶部