2016-04-20 53 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]"