【问题标题】:Excel VBA ADODB SQL sum if data matches如果数据匹配,则 Excel VBA ADODB SQL 总和
【发布时间】:2017-06-16 19:56:31
【问题描述】:

这是我目前用来生成我的 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 时,我需要使用与 select 中使用的 sum 语句相同的 having 子句。

【问题讨论】:

  • 你能更好地解释问题是什么吗?
  • 这更容易实现,方法是从查询中删除第四列(带有 test123 的列)并将查询修改为分组查询。
  • @jkpieterse,不幸的是,我需要保留包含 test123 的列,因为它有所需的数据。分组依据是否仍可用于此列?谢谢

标签: sql vba excel adodb


【解决方案1】:

如前所述,考虑按前三列分组的聚合查询,F7F9F6、求和 F10 em> 并取所有其他非分组列的最大值。 Max/Min 适用于字符串和数字。

请注意,您的原始查询嵌入为外部聚合的派生表。下面是要合并到 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]

【讨论】:

  • 非常感谢你的工作!!我自己要花很长时间才能做到这一点。是否可以排除 [F10] = 0 的行。感谢您的帮助。
  • 我想我设法正确地遵循并让它工作,我仍然是使用 SQL 的新手,尤其是聚合查询,但我在之前添加了 'WHERE NOT main.[F10] = 0' group by,似乎正在工作,这是错误的,请告诉我。谢谢
  • 不,WHERE 子句应该在 GROUP BY 之前。乐意效劳!编码愉快!
  • 您好,我知道已经过去了几个星期,但我一直在做一些进一步的测试,我仍然在 F10 中获得零分,请我再挑一下你的大脑。谢谢
  • 也许 F10 是一个字符串,尝试将 0 括在引号中:WHERE NOT main.[F10] = '0'
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多