大家好,今日继续讲解VBA数据库解决方案,今日的内容是第67讲:内连接INNER如何在两个不同的SQL中建立连接。今日的内容是之前内容的延伸,在前面的讲解中我讲了利用INNER连接的两个数据源都是字段值与值的条件匹配,如果字段不是唯一值时数据会报错。如何理解这个问题呢?所谓连接,目的是查询,找出条件相同值的匹配,对于一对多,或者多对一的匹配,在内连接中是无法建立起对应关系的,多对一,或者一对多如何连接,不是我们关心的,我们关心的是如何把多值查询变成值的唯一查询,也就是说在连接前,要建立一个值的排重处理,这个排重处理我们在工作表中可以用数据透视表来完成,在此我们采用的方案是SQL语句。
我们还是以实例来详细讲解,实例,某策划公司团队中有两个负责部门对于策划项目的报价,在外联部门报价是:
在每个项目中由若干个类别组成,每个类别需要的人数和价格如上,同时后勤部门的报价如下:
报价中含有对每个项目组成类别的占用车辆及需要的工具套数和单价。
当收到上述两个部门报价后,我们要根据内容整理出总的报价,总报价中不必关心其中小类别的报价,只要汇总即可。我们要得出的只是项目,总人数,总价格,出动车辆,工具总套数,工具总价格等字段汇总,这个时候该如何处理呢?
思路:对于两个数据表先分别进行数据的汇总,然后再用内连接同时连接这两个汇总的数据,就可以得到我们的最终结果了。当然,思路很好建立,如何实现呢?
我们先看下面我给出的代码:
Sub mynzRecords_67() '第67讲 内连接Inner join 连接两个SQL
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Worksheets("67").Select
Cells.ClearContents
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.FullName
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 12.0;hdr=yes;imex=1';data source=" & strPath
strSQL1 = "select 项目,SUM(人数) AS 总人数,SUM(价格) AS 总价格 from [数据4$] group by 项目"
strSQL2 = "select 项目,SUM(车辆) AS 出动车辆,SUM(工具套数) AS 工具总套数,SUM(工具套数*工具单价) AS " _
& "工具总价格 from [数据5$] group by 项目"
strSQL = "Select a.项目,a.总人数,a.总价格,b.出动车辆,b.工具总套数,b.工具总价格 From (" _
& strSQL1 & ") a Inner Join (" & strSQL2 & ") b " _
& "ON a.项目=b.项目 GROUP BY a.项目,a.总人数,a.总价格,b.出动车辆,b.工具总套数,b.工具总价格"
rsADO.Open strSQL, cnADO, 1, 3
For i = 1 To rsADO.Fields.Count
Cells(1, i) = rsADO.Fields(i - 1).Name
Next
Range("a2").CopyFromRecordset rsADO
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代码截图:
代码解读:
1 上述代码先用SQL1 和SQL2 对"数据4" 工作表和"数据5"工作表进行数据的汇总。建立项目的汇总数据。
2 strSQL1 = "select 项目,SUM(人数) AS 总人数,SUM(价格) AS 总价格 from [数据4$] group by 项目"
上述SQL语句实现的的是对工作表4的汇总,上面有新的字段的设置。
3 strSQL2 = "select 项目,SUM(车辆) AS 出动车辆,SUM(工具套数) AS 工具总套数,SUM(工具套数*工具单价) AS " _
& "工具总价格 from [数据5$] group by 项目"
上述SQL语句实现的的是对工作表5的汇总,上面也有新的字段的设置。
4 strSQL = "Select a.项目,a.总人数,a.总价格,b.出动车辆,b.工具总套数,b.工具总价格 From (" _
& strSQL1 & ") a Inner Join (" & strSQL2 & ") b " _
& "ON a.项目=b.项目 GROUP BY a.项目,a.总人数,a.总价格,b.出动车辆,b.工具总套数,b.工具总价格"
利用上述的SQL语句,实现了对SQL1和SQL2的内连接,条件是a.项目=b.项目。
上述语句应用非常的方便,但我仍是反复的提醒大家注意,尽可能不要自己去写代码,我提倡的是搭积木的思想,建立起自己的代码库,用的时候,可以方便的利用即可。
下面看本实例的运行情况:
这样就给出了,三个项目的报价清单。
今日内容回向:
1 如何建立连接于两个SQL的内间接查询?
2 应用于连接于两个SQL的内间接查询是什么样的实际场景?