以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  求教三张表关联查询  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=59858)

--  作者:baoxyang
--  发布时间:2014/11/12 14:09:00
--  求教三张表关联查询

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

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

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


--  作者:baoxyang
--  发布时间: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("统计")


--  作者:有点甜
--  发布时间:2014/11/12 14:25:00
--  

1、http://www.foxtable.com/help/topics/2314.htm

 

2、http://www.foxtable.com/help/topics/2473.htm

 


--  作者:baoxyang
--  发布时间:2014/11/12 14:34:00
--  
以上,估计实现不了上述的问题。因为表A,表B,表C,都有可能关联列不存在现象。无法判断哪个做为基表呀
--  作者:baoxyang
--  发布时间:2014/11/12 14:37:00
--  

多表统计工具的局限性

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

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

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

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

 

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


--  作者:有点甜
--  发布时间:2014/11/12 14:37:00
--  

1、先得到下面这张总表

 

Select 客户简称,退货费 as "费用","退货费" As 类型 from {表A}
union Select 客户简称,提货费,"提货费" from {表B}
union Select 客户简称,托运费, "托运费" from {表C}

2、对上表进行交叉表处理

 

------或者

 

1、分别得到3个表格

 

2、对三个表格进行连接处理


--  作者:baoxyang
--  发布时间:2014/11/12 14:45:00
--  

五、UNION 运算符

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

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

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

 

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


--  作者:有点甜
--  发布时间:2014/11/12 14:51:00
--  
 Select 客户简称,退货费 as "费用","退货费" As 类型 from {表A}
union Select 客户简称,提货费,"提货费" from {表B}
union Select 客户简称,托运费, "托运费" from {表C}

--  作者:baoxyang
--  发布时间: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}

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


--  作者:有点甜
--  发布时间:2014/11/12 15:18:00
--  
以下是引用baoxyang在2014-11-12 15:16:00的发言:

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

 

合并表的时候区分啊,你可以先实验生成这张表看看效果么?

 

生成以后,按客户简称分组,类型分组,就行啦。