簡體   English   中英

如果數據匹配,則Excel VBA ADODB SQL總和

[英]Excel VBA ADODB SQL sum if data matches

這是我當前用於生成SQL字符串的查詢,該查詢當前正在獲取正確的信息。

Dim colArray As Variant: colArray = Array(7,9,6,8,10,11,15,25)                               

szSQL = "SELECT 
          sWIR.[F" & Join(colArray, "], sWIR.[F") & "], sCodes.[F7]
          FROM [" & SourceWIR & "] sWIR INNER JOIN [" & SourceCODES & "] AS sCodes ON sWIR.[F5] = sCodes.[F6] 
          WHERE sWIR.[F1] =""" & Address & """ 
          ORDER BY sCodes.[F7], sWIR.[F7];"

我需要包含的是,如果第7、9、6列中的數據相等,則第10列求和

下面是完整的代碼,我正在使用ADODB連接

Dim szConnect As String, szSQL As String
Dim SourceFileName As String: SourceFileName = Left(wb.Name, Len(wb.Name) - 5)
Dim SourceFile As String: SourceFile = wb.FullName
Dim rsCon As New ADODB.Connection
Dim rsData As New ADODB.Recordset
szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & SourceFile & ";" & "Extended Properties=""Excel 12.0;HDR=No"";"
rsCon.Open szConnect

Dim LastRow As Long: LastRow = wb.WIR.Cells(Rows.Count, "A").End(xlUp).Row
Dim LastCol As Long: LastCol = wb.WIR.Cells(1, wb.WIR.Columns.Count).End(xlToLeft).Column

Dim SourceWIR As String: SourceWIR = wb.WIR.Name & "$"
Dim SourceCODES As String: SourceCODES = wb.CODES.Name & "$"

Dim colArray As Variant: colArray = Array(7,9,6,8,10,11,15,25)

szSQL = "SELECT  sWIR.[F" & Join(colArray, "], sWIR.[F") & "], sCodes.[F7]FROM [" & SourceWIR & "] sWIR INNER JOIN [" & SourceCODES & "] AS sCodes ON sWIR.[F5] = sCodes.[F6] " & _
        "WHERE sWIR.[F1] =""" & Address & """ ORDER BY sCodes.[F7], sWIR.[F7];"

rsData.Open szSQL, rsCon, adOpenKeyset, adLockOptimistic

wb.Sheets("Sheet2").Range("A25").CopyFromRecordset rsData

下圖顯示了數據現在的外觀以及找到匹配項后數據的外觀。

在此處輸入圖片說明

在Parfait的幫助下,他為我提供了正確的字符串。

經過數小時的谷歌搜索和測試,我能夠獲得正確的字符串以排除零值。

szSQL = SELECT 
             main.[wF7], main.[F9], main.[F6], Max(main.[F8]) As maxF8,
             Sum(main.[F10]) As sumF10, Max(main.[F11]) As maxF11, 
             Max(main.[F15]) As maxF15, Max(main.[F25]) As maxF25, 
             Max(main.[sF7]) As maxsF7 
         FROM (
             SELECT 
                 sWIR.[F7] As wF7, sWIR.[F9], sWIR.[F6], sWIR.[F8], sWIR.[F10],
                 sWIR.[F11], sWIR.[F15], sWIR.[F25], sCodes.[F7] As sF7 
             FROM 
                 [Works Instruction Record$] AS sWIR 
             INNER JOIN 
                 [Codes$] AS sCodes 
             ON 
                 sWIR.[F5] = sCodes.[F6] 
             WHERE 
                 sWIR.[F1] ="1 Foney Road") AS main 
         GROUP BY 
             main.[wF7], main.[F9], main.[F6] 
         HAVING 
             Sum(main.[F10]) = 0 
         ORDER BY 
             Max(main.[sF7]), main.[wF7];

我發現在使用group by時,我需要使用have子句和select中使用的sum語句相同。

如前所述,考慮按前三列F7F9F6分組的匯總查詢,將F10求和並取所有其他未分組列的最大值。 最大/最小處理字符串和數字。

請注意,您的原始查詢嵌入為派生表,外部匯總。 以下是要合並到您的VBA字符串中的SQL版本。 由於GROUP BY請勿使用Join()

SELECT main.[wF7], main.[F9], main.[F6], Max(main.[F8]) As maxF8, 
       Sum(main.[F10]) As sumF10, Max(main.[F11]) As maxF11, 
       Max(main.[F15]) As maxF15, Max(main.[F25]) As maxF25, Max(main.[sF7]) As maxsF7
FROM

  (SELECT sWIR.[F7] As wF7, sWIR.[F9], sWIR.[F6], sWIR.[F8], sWIR.[F10],
          sWIR.[F11], sWIR.[F15], sWIR.[F25], sCodes.[F7] As sF7
   FROM [" & SourceWIR & "] AS sWIR 
   INNER JOIN [" & SourceCODES & "] AS sCodes 
       ON sWIR.[F5] = sCodes.[F6]
   WHERE sWIR.[F1] ='" & Address & "') AS main

GROUP BY main.[wF7], main.[F9], main.[F6]
ORDER BY Max(main.[sF7]), main.[wF7]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM