Excel / VBA / ADO – SQL查询不返回正确的结果

我试图拉开具有大于30,60和90天的出发date(全部来自同一文件)的Folio ID。 如果其中一个ID还有一个dateless于30天的事件,我不希望这个ID被拉下来。 我还希望仅当该ID还具有大于30,60或90天的出发date时,为具有空白(空?)出发date的作品集ID拉取date。

我已经尝试了左,内,右和嵌套连接的多种组合(感谢提供给前一个问题的答案)。 我已经接近,但由于某种原因,我的查询并没有拉出任何空白的出发date,即使我知道它们存在。 我的查询到目前为止如下所示:

sSQL = "SELECT t1.[Folio Type], t1.[Folio ID],t1.[Departure Date],t1.[Folio Total]" sSQL = sSQL & " FROM" sSQL = sSQL & " (SELECT [Folio Type], [Folio ID],[Folio Total],[Departure Date]" sSQL = sSQL & " FROM [Individual Folios$B2:O150000] GROUP BY [Folio Type],[Folio ID],[Folio Total],[Departure Date]" sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] < " & G30E & ") As t1 " sSQL = sSQL & " LEFT JOIN" sSQL = sSQL & " (SELECT [Folio Type],[Folio ID],[Departure Date],[Folio Total]" sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" sSQL = sSQL & " group by [Folio Type],[Folio ID],[Departure Date],[Folio Total]" sSQL = sSQL & " HAVING [Folio Total] <> 0 and ([Departure Date] > " & G30E & " or [Departure Date] is null)) as t2" sSQL = sSQL & " on t1.[Folio ID] = t2.[Folio ID]" sSQL = sSQL & " where t2.[Folio ID] is null" 

我也有一个类似的查询(试图完成与第一个查询相同的事情)使用嵌套连接。 我认为这两个查询应该拉相同的值,但总数是不同的:

  sSQL = "SELECT t1.[Folio Type], t1.[Folio ID],t1.[Departure Date],t1.[Folio Total]" sSQL = sSQL & " FROM" sSQL = sSQL & " ((SELECT [Folio Type], [Folio ID],[Folio Total],[Departure Date]" sSQL = sSQL & " FROM [Individual Folios$B2:O150000] GROUP BY [Folio Type],[Folio ID],[Folio Total],[Departure Date]" sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] < " & G30E & ") As t1 " sSQL = sSQL & " LEFT JOIN" sSQL = sSQL & " (SELECT [Folio Type],[Folio ID],[Departure Date],[Folio Total]" sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" sSQL = sSQL & " group by [Folio Type],[Folio ID],[Departure Date],[Folio Total]" sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] > " & G30E & ") as t2" sSQL = sSQL & " on t1.[Folio ID] = t2.[Folio ID])" sSQL = sSQL & " LEFT JOIN" sSQL = sSQL & " (SELECT [Folio Type],[Folio ID],[Departure Date],[Folio Total]" sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" sSQL = sSQL & " group by [Folio Type],[Folio ID],[Departure Date],[Folio Total]" sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] is null) as t3" sSQL = sSQL & " on t1.[Folio ID] = t3.[Folio ID]" sSQL = sSQL & " where t2.[Folio ID] is null or t3.[Folio ID] is null" 

任何帮助是极大的赞赏。

尝试使用一系列的UNION查询。 每个查询都有它的WHERE子句来限制返回的logging。

由于大部分的SELECT是相同的,我会使用WITH子句:

 WITH A AS(SELECT * FROM [FoliosXXX]) SELECT * FROM A WHERE [Departure DATE] <= 30 UNION SELECT * FROM A WHERE [Departure DATE] > 30 AND [Departure DATE] <= 60 UNION SELECT * FROM A WHERE [Departure DATE] >= 60 

您可以使SELECT for A成为一个复杂/已join/等。 查询。 不知道GROUPing需要添加到以后的SELECTs。

一种变化是使用UNION,在SELECT中使用NOT IN子句来排除已经处理的logging。