Foxtable(狐表)用户栏目专家坐堂 → 求教三张表关联查询


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

主题:求教三张表关联查询

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


加好友 发短信
等级:狐精 帖子:3313 积分:23146 威望:0 精华:1 注册:2009/3/31 11:25:00
求教三张表关联查询  发帖心情 Post By:2014/11/12 14:09:00 [显示全部帖子]

表A有客户简称、退货费;表B有客户简称、提货费;表C有客户简称、托运费

我想得到结果是包含所有客户简称的退货费、提货费、托运费及合计列(为退货费+提货费+托运费)结果

请教,这个SQL语句如何写?谢谢指点!!


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


加好友 发短信
等级:狐精 帖子:3313 积分:23146 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2014/11/12 14:10:00 [显示全部帖子]

我用这个方法能实现,比较复杂。

Dim f1 As fxDataSource
Dim f2 As fxDataSource
Dim f3 As fxDataSource
Dim datenow As Date = Functions.Execute("SysTime")
Dim d1 As String = format(e.Form.controls("datetimePicker1").value,"yyyy-MM-dd")
Dim d2 As String = format(e.Form.controls("datetimePicker2").value,"yyyy-MM-dd")

cmd.CommandText = "select 客户简称,总费用 from {托运单据} where 开单日期 >= '"& d1 &"' and 开单日期 <= '"& d2 &"' and 销单否 = '否'"
Dim dt1 As DataTable = cmd.ExecuteReader()
Dim cb1 As new GroupTableBuilder("统计表1",dt1)
cb1.Groups.AddDef("客户简称")
cb1.Totals.Adddef("总费用")
f1 = cb1.BuildDataSource()

cmd.CommandText = "select 客户简称,退货费 from {退货明细} where 入库日期 >= '"& d1 &"' and 入库日期 <= '"& d2 &"'"
Dim dt2 As DataTable = cmd.ExecuteReader()
Dim cb2 As new GroupTableBuilder("统计表2",dt2)
cb2.Groups.AddDef("客户简称")
cb2.Totals.Adddef("退货费")
f2 = cb2.BuildDataSource()

cmd.CommandText = "select 客户简称,提货费 from {提货计划明细} where 提货日期 >= '"& d1 &"' and 提货日期 <= '"& d2 &"'"
Dim dt3 As DataTable = cmd.ExecuteReader()
Dim cb3 As new GroupTableBuilder("统计表3",dt3)
cb3.Groups.AddDef("客户简称")
cb3.Totals.Adddef("提货费")
f3 = cb3.BuildDataSource()
f1.Combine("客户简称",f2,"客户简称")
f1.Combine("客户简称",f3,"客户简称")
Tables("S费用统计_Table2").DataSource = f1

Dim dtb As New DataTableBuilder("统计")
dtb.AddDef("客户简称", Gettype(String), 100)
dtb.AddDef("托运费", Gettype(Double))
dtb.AddDef("退货费", Gettype(Double))
dtb.AddDef("提货费", Gettype(Double))
dtb.AddDef("合计", Gettype(Double))
dtb.Build()
For Each nm As String In DataTables("S费用统计_Table2").GetValues("客户简称")
    Dim dr As DataRow = DataTables("统计").AddNew()
    dr("客户简称") = nm
    Dim s1,s2,s3 As Double
    s1 = DataTables("S费用统计_Table2").Compute("Sum(总费用)","[客户简称] = '" & dr("客户简称") & "'")
    s2 = DataTables("S费用统计_Table2").Compute("Sum(退货费)","[客户简称] = '" & dr("客户简称") & "'")
    s3 = DataTables("S费用统计_Table2").Compute("Sum(提货费)","[客户简称] = '" & dr("客户简称") & "'")
    dr("托运费") = s1
    dr("退货费") = s2
    dr("提货费") = s3
    dr("合计") = dr("托运费") + dr("退货费") + dr("提货费")
Next
Tables("S费用统计_Table1").DataSource = DataTables("统计")


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


加好友 发短信
等级:狐精 帖子:3313 积分:23146 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2014/11/12 14:34:00 [显示全部帖子]

以上,估计实现不了上述的问题。因为表A,表B,表C,都有可能关联列不存在现象。无法判断哪个做为基表呀

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


加好友 发短信
等级:狐精 帖子:3313 积分:23146 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2014/11/12 14:37:00 [显示全部帖子]

多表统计工具的局限性

SQLGroupTableBuilder和SQLCrossTableBuilder,包括SQLJoinTableBuilder,都可以对多个表的数据进行统计,但是对于参与统计的表有两点要求:

1、参与统计的表必须是一对多或一对一的关系,不能是多对多的关系。
2、如果参与统计的表是一对多的关系,那么父表中的列只能作为分组列,而不能作为统计列。

如果参与统计的表无法满足上述要求,我们也就无法一次性地通过某个统计工具来得出统计结果,只能使用统计工具分别对各表进行统计,然后将多个统计结果组合起来。

接下来我们就介绍如何组合多个统计结果。

 

我现在三张表是多对多的关系哦。


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


加好友 发短信
等级:狐精 帖子:3313 积分:23146 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2014/11/12 14:45:00 [显示全部帖子]

五、UNION 运算符

UNION运算符用于组合两个查询的结果。
例如有一个客户表,一个供应商表,我需要得到所有在中国的客户和供应商的名称和地址。
因为数据位于不同的表中,显然,我们需要用两个查询才能完成任务:

SELECT 公司名称, 地址 FROM {客户} WHERE 国家 = '中国' UNION SELECT 公司名称, 地址 FROM {供应商} WHERE 国家 = '中国'

两个查询的字段名称、个数、类型必须完全一致才行。

 

字段名称、个数、类型必须完全一致才行,但我提取字段列是不一致的呀,这样也可以吗?


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


加好友 发短信
等级:狐精 帖子:3313 积分:23146 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2014/11/12 15:16:00 [显示全部帖子]

以下是引用有点甜在2014-11-12 14:51:00的发言:
 Select 客户简称,退货费 as "费用","退货费" As 类型 from {表A}
union Select 客户简称,提货费,"提货费" from {表B}
union Select 客户简称,托运费, "托运费" from {表C}

没有看明白。客户简称,托运费, "托运费" 这个是什么意思?


 回到顶部