2016-04-25 215 views
0

我想拉开具有大于30,60和90天的出发日期(全部来自同一文件)的Folio ID。如果其中一个ID的日期少于30天,我不希望这个ID被拉下。 只有当该ID的出发日期大于30,60或90天时,我也希望为带有空白(空?)出发日期的作品集ID拉取日期。Excel/VBA/ADO - SQL查询不返回正确的结果

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

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" 

任何帮助,非常感谢。

回答

1

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

由于大部分的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 

您可以进行选择用于是一个复杂的/加盟/等。查询。不确定GROUPing需要将它添加到后面的SELECT中。

一个变体是使用UNION,并在SELECT中使用NOT IN子句来排除已处理的记录。

+0

OP用于连接到Excel工作簿的Jet/ACE SQL引擎不支持窗口函数。 WITH()不起作用。 – Parfait

+0

你的权利 - 排序 - WITH以上是一个SQL函数,而不是Windows函数。但是你很可能是正确的,不支持Jet或其他非SQL Server驱动程序。工会可能会工作,只需要更多的打字。 – rheitzman