Excel / ADO / VBA:计数返回不正确的结果

我有以下代码的macros:

sSQL = "select [Folio Type], [Folio ID], [Departure Date]," & _ " Sum([Folio Total]), Count([Folio ID])" & _ " from [Individual Folios$B2:O150000]" & _ " group by [Folio Type], [Departure Date], [Folio ID], [Folio Total]" & _ " having Sum([Folio Total]) <> 0" 

上面的代码给了我每个[Folio ID]不正确的计数1。 无论[Departure Date]如何,我都希望得到给定[Folio ID]的总数。 当我删除一些领域,我得到不同的结果 – 下面的代码似乎正常工作:

  sSQL = "select [Folio ID], Count([Folio ID]), Sum([Folio Total])" & _ " from [Individual Folios$B2:O150000]" & _ " group by [Folio ID], [Folio Total]" & _ " having sum([Folio Total]) <> 0" 

我需要找出如何获得与上面相同的结果后,添加删除的领域。我的猜测是,查询是通过考虑所有的领域来统计事件。 如果是这样的话,有没有简单的解决方法?

你需要在两个查询中做到这一点。 我已经把第二个作为一个子查询在FROM子句中。

 SELECT a.[Folio Type] ,a.[Folio ID] ,a.[Departure Date] ,b.FolioCount ,b.FolioSum FROM [Individual Folios$B2:O150000] a INNER JOIN (SELECT [Folio ID], [Folio Type] ,Count([Folio ID]) As FolioCount ,SUM([Folio Total]) As FolioSum FROM [Individual Folios$B2:O150000] GROUP BY [Folio ID] ,[Folio Type] HAVING SUM([Folio Total]) <> 0 ) b ON a.[Folio ID] = b.[Folio ID] 

让你的string等于这个查询:

  sSQL = "SELECT a.[Folio Type],a.[Folio ID],a.[Departure Date]" _ & ",b.FolioCount,b.FolioSum" _ & " FROM [Individual Folios$B2:O150000] a" _ & " INNER JOIN" _ & " (SELECT [Folio ID], [Folio Type] " _ & " Count([Folio ID]) As FolioCount,SUM([Folio Total]) As FolioSum" _ & " FROM [Individual Folios$B2:O150000]" _ & " GROUP BY [Folio ID], [Folio Type]" _ & " HAVING SUM([Folio Total]) <> 0) b"_ & " ON a.[Folio ID] = b.[Folio ID]" 

考虑派生表的内部连接(即FROM子句中的子查询)。

标准SQL (概念图)

 SELECT t1.[Folio Type], t1.[Folio ID], t1.[Departure Date], t2.FolioCount, t2.FolioSum FROM (SELECT [Folio Type], [Folio ID], [Departure Date], [Folio Total] FROM [Individual Folios$B2:O150000] ) AS t1 INNER JOIN (SELECT [Folio ID], Count([Folio ID]) As FolioCount, SUM([Folio Total]) As FolioSum FROM [Individual Folios$B2:O150000] GROUP BY [Folio ID], [Folio Total] HAVING SUM([Folio Total]) <> 0 ) As t2 ON t1.[Folio ID] = t2.[Folio ID] AND t1.[Folio Total] = t2.[Folio Total] 

VBAembeddedstring:

  sSQL = "SELECT t1.[Folio Type], t1.[Folio ID], t1.[Departure Date]," sSQL = sSQL & " t2.FolioCount, t2.FolioSum" sSQL = sSQL & " FROM" sSQL = sSQL & " (SELECT [Folio Type], [Folio ID], [Departure Date]" sSQL = sSQL & " FROM [Individual Folios$B2:O150000]) AS t1" sSQL = sSQL & " INNER JOIN" sSQL = sSQL & " (SELECT [Folio ID], Count([Folio ID]) As FolioCount," sSQL = sSQL & " SUM([Folio Total]) As FolioSum" sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" sSQL = sSQL & " GROUP BY [Folio ID], [Folio Total]" sSQL = sSQL & " HAVING SUM([Folio Total]) <> 0) As t2" sSQL = sSQL & " ON t1.[Folio ID] = t2.[Folio ID]" sSQL = sSQL & " AND t1.[Folio Total] = t2.[Folio Total]" 

试试这个:

 select max([Folio Type]), [Folio ID], max([Departure Date]), sum([Folio Total]), count([Folio ID]) from [Individual Folios$B2:O150000] group by [Folio ID], [Folio Total] having sum([Folio Total]) <> 0