【问题标题】:Excel/VBA/ADO - SQL query not returning correct resultsExcel/VBA/ADO - SQL 查询未返回正确结果
【发布时间】:2016-04-26 06:39:35
【问题描述】:

我正在尝试提取出发日期大于 30、60 和 90 天的 Folio ID(均来自同一个文件)。如果其中一个 ID 的日期也少于 30 天,我不希望该 ID 被拉出。 我还希望仅当该 ID 的出发日期也大于 30、60 或 90 天时才为具有空白(null?)出发日期的 Folio ID 提取日期。

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

 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"

非常感谢任何帮助。

【问题讨论】:

    标签: sql vba excel ado


    【解决方案1】:

    尝试使用一系列 UNION 查询。每个查询都有其 on 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
    

    您可以将 A 的 SELECT 设置为复杂/连接/等。询问。不确定 GROUPing 需要将其添加到以后的 SELECT 中。

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

    【讨论】:

    • OP 用于连接 Excel 工作簿的 Jet/ACE SQL 引擎不支持窗口函数。 WITH() 将不起作用。
    • 您的权利 - 有点 - 上面的 WITH 是 SQL 函数而不是 Windows 函数。但是您可能是正确的,Jet 或其他非 SQL Server 驱动程序不支持。 UNIONS 可以工作,只是需要更多的输入。
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多