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 时,我需要使用 having 子句和 select 中使用的相同的 sum 语句。
如前所述,考虑按前三列分组的聚合查询,F7、F9、F6,求和 F10 并取所有其他未分组列的最大值。 Max/Min 适用于字符串和数字。
请注意您的原始查询作为派生 table 嵌入,并在外部聚合。下面是要合并到您的 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]
这是我目前用来生成 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 时,我需要使用 having 子句和 select 中使用的相同的 sum 语句。
如前所述,考虑按前三列分组的聚合查询,F7、F9、F6,求和 F10 并取所有其他未分组列的最大值。 Max/Min 适用于字符串和数字。
请注意您的原始查询作为派生 table 嵌入,并在外部聚合。下面是要合并到您的 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]