2016-04-20 55 views
0

我有下面的代码的宏:的Excel/ADO/VBA:计数返回不正确的结果

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" 

上面的代码给我的1对每个[Folio ID]不正确的计数。无论[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" 

我需要弄清楚如何添加删除字段回后得到相同的结果如上我。猜测是查询是通过考虑所有字段来统计事件的发生。如果是这样的话,有没有简单的解决方法?

回答

1

你需要做的这两个查询。我已经把第二个作为子查询放在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] 

让您的字符串等于这个查询:

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]" 
+0

这个答案是相似的芭菲的,但我选择了这一个,因为某种原因,我不得不删除他提供的代码的最后一行: 'sSQL = sSQL&“AND t1。[Folio Total] = t2。[Folio Total]' –

+0

我添加了最后一次连接,因为你的原始'GROUP BY'有'[Folio ID]'和'[Folio Total]'我差点问起! – Parfait

1

让这个尝试:

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 
2

考虑(在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] 

VBA嵌入字符串:

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]"