简体   繁体   English

Excel / VBA / ADO-SQL查询未返回正确结果

[英]Excel/VBA/ADO - SQL query not returning correct results

I am trying to pull Folio IDs that have departure dates of greater than 30, 60, and 90 days (all from the same file). 我试图提取日期大于30、60和90天的Folio ID(均来自同一文件)。 If one of the IDs also has an occurrence with a date that is less than 30 days, I don't want that ID pulled. 如果其中一个ID发生的日期还不到30天,则我不希望该ID被撤消。 I also want the date pulled for Folio IDs with a blank (null?) departure date only if that ID also has a departure date greater than 30, 60, or 90 days. 我还希望仅当出发日期为空(空吗?)的Folio ID的出发日期也超过30、60或90天时,才能提取该日期。

I have tried numerous combinations of left, inner, right, and nested joins (thanks to answers provided to a previous question). 我尝试了左联接,内部联接,右联接和嵌套联接的多种组合(感谢上一个问题提供的答案)。 I have come close, but for some reason my query is not pulling any of the blank departure dates, even though I know they exist. 我已经接近了,但是由于某种原因,我的查询没有拉出任何空白的出发日期,即使我知道它们存在。 My query so far is as follows: 到目前为止,我的查询如下:

 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"

I also have a similar query (that tries to accomplish the same thing as the first query) using nested joins. 我也有一个使用嵌套联接的类似查询(试图完成与第一个查询相同的操作)。 I thought the two queries should pull the same values, but the totals are different: 我以为两个查询应该取相同的值,但总数却不同:

 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"

Any help is greatly appreciated. 任何帮助是极大的赞赏。

Try using a series of UNION queries. 尝试使用一系列UNION查询。 Each query has its on WHERE clause to restricte the records returned. 每个查询都有其on WHERE子句以限制返回的记录。

Since most of the SELECT is the same I'd use a WITH clause: 由于大多数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

You can make the SELECT for A to be a complex/joined/etc. 您可以将A的SELECT设为复杂/联合/等。 query. 查询。 Not sure about GROUPing need to add that to the later SELECTs. 不确定GROUPING是否需要将其添加到以后的SELECT中。

A variation is to use UNIONs and in the SELECT use a NOT IN clause to exclude records already processed. 一种变化是使用UNION,在SELECT中使用NOT IN子句以排除已处理的记录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM