1

我对几个表进行了查询,并得到以下形式的结果:

SomeId      Input
1           2
1           5
2           3
2           1
1           2

我希望能够按 Id 作为第三个字段求和,所以我会得到

SomeId      Input       subTotal
1           2           2
1           5           7
2           3           3
2           1           4
1           2           9

可能吗?谢谢

4

2 回答 2

0

这里有几个其他的想法。两者都有其缺点。它们都涉及使用常规查询。

第一个想法:调用 VBA 函数来跟踪总数。

缺点是您必须通过 SomeID 订购您的桌子。

此外,仅当函数获得不同的 SomeID 时,即使它是不同的查询,运行总数也会自行重置。这意味着第一条记录上 SomeID 的值必须不同于上一个查询的最后一条记录。

SELECT SomeTable.SomeId, SomeTable.SomeInput, MyRunningTotal([SomeID],[SomeInput]) AS SubTotal
FROM SomeTable
ORDER BY SomeTable.SomeId;

Function MyRunningTotal(SomeID As Long, SomeInput As Long) As Long
   Static LastSomeID As Long
   Static RunningTotal As Long
   If SomeID <> LastSomeID Then
      RunningTotal = 0
      LastSomeID = SomeID
   End If
   RunningTotal = RunningTotal + SomeInput
   MyRunningTotal = RunningTotal
End Function

第二个想法:使用 Dsum。这基本上是查询中的查询。

缺点是对于大型记录集,它可能非常慢。这是因为它必须为每条记录运行单独的查询。

此外,您必须添加一个自动增量字段(在其 ID 下面的示例代码中)。

SELECT SomeTable.ID, SomeTable.SomeId, SomeTable.SomeInput, 
DSum("SomeInput","SomeTable","[SomeID]=" & [SomeID] & " and [ID]<=" & [ID]) AS SubTotal
FROM SomeTable;
于 2013-06-09T14:38:11.200 回答
0

是的,这当然是可能的,但由于上述问题,仅使用 Access SQL 查询是无法完成的。这两个问题是:

  1. 源数据没有顺序键值(所以<=不能使用带条件的自连接)

  2. 源数据未按顺序排序SomeId(表明该顺序可能具有其他意义),这将使基于集合的方法进一步复杂化。

幸运的是,执行此操作所需的 VBA 并不太复杂:

Sub CreateSubtotals()
Dim cdb As DAO.Database, rst As DAO.Recordset
Dim dct As Object  '' Dictionary
Set dct = CreateObject("Scripting.Dictionary")  '' New Dictionary
Set cdb = CurrentDb

'' 'dct' will hold the running totals for each 'SomeId'
Set rst = cdb.OpenRecordset( _
        "SELECT DISTINCT SomeId " & _
        "FROM qryYourOriginalQuery", _
        dbOpenSnapshot)
Do While Not rst.EOF
    dct.Add rst!SomeId.Value, 0
    rst.MoveNext
Loop
rst.Close

'' create new table to hold results
cdb.Execute _
        "SELECT SomeId, Input, 0 AS subTotal " & _
        "INTO tblYourDataWithSubtotals " & _
        "FROM qryYourOriginalQuery", _
        dbFailOnError

'' fill in the 'subTotal' column
Set rst = cdb.OpenRecordset("tblYourDataWithSubtotals", dbOpenTable)
Do While Not rst.EOF
    dct(rst!SomeId.Value) = dct(rst!SomeId.Value) + rst!Input.Value
    rst.Edit
    rst!subTotal.Value = dct(rst!SomeId.Value)
    rst.Update
    rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Set dct = Nothing
Set cdb = Nothing
End Sub
于 2013-06-09T12:04:05.387 回答