查询当前行之后为空白的行的总和,直到下一个非空行

时间:2012-01-22 09:25:05

标签: sql ms-access

我有一张桌子。它有这些列,比方说:

OpeningBalance    ClosingBalance    SomeOtherValueIDontCareAbout
--------------    --------------    -----------------------------
22                 100              Foo
16                  84              Bar
                                    Har
                                    Tar
                                    Zar
                                    Bar
                                    Foo Bar
12                  16              Har
                                    Par
91                  126             Zoogle
                                    Proper
                                    Hello
21                  182             Sing
-------------------------------------------------------------------

您会注意到某些行没有OpeningBalanceClosingBalance列的值。

ClosingBalance始终大于OpeningBalance

我们要计算一行的余额增量(ClosingBalance - OpeningBalance)。然后,我们要计算该行下面有多少行有OpeningBalanceClosingBalance的空白值,直到有一行值。然后,我们将显示如下所示的摘要。

Group               IncreaseInBalance        TotalRowsItAppliesTo
------------        ------------------       ---------------------
Group1               78                       1
Group2               68                       6
Group3                4                       2
Group4               35                       3
Group5              161                       1
--------------------------------------------------------------------

这是我们正在处理的MS Access数据库。我完全迷失了。我已经有一段时间没有以任何方式,形状或形式触及过SQL。

请帮助。

更新

感谢您的评论。我从我的一位好朋友那里得到了这个问题。我和他都无法控制数据的组织。如果它是一个选择,我会从一开始就设计数据库,就像一张海报建议的那样分出两张桌子。

鉴于此,我仔细研究了数据。

数据按两列排序 - 首先是一个名为Location的字符串值,然后是一个名为RecordingDate的DateTime值。

但是,这两列中的任何一列都不适用于空行。如同,大约200行属于一个位置和一个日期,然后另外100行属于同一位置的另一个日期,然后另外200行属于具有不同日期的不同位置。但是,即使在第一行之后,仍有许多空行。

我希望你得到我说的话。

因此,对于ORDER BY,我认为在Location或RecordingDate上对空白行集进行计数是不对的。

在Jet数据库中是不是有一些## rowId之类的东西?我想拥有这项工作的组织假设这些行被认为是将它们输入数据库的顺序。

有出路吗?

1 个答案:

答案 0 :(得分:2)

单独使用SQL无法解决这个问题,因为SQL不知道行的顺序。 SQL将表视为数学集。

首先,添加一个名为" Group"的新列。作为Long Integer到你的桌子。然后执行此代码以准备表

Public Sub PrepareBalance()
    Dim db As DAO.Database, rs As DAO.Recordset
    Dim group As Long

    Set db = CurrentDb
    Set rs = db.OpenRecordset("tblBalance")
    Do Until rs.EOF
        If Not IsNull(rs!OpeningBalance) Then
            group = group + 1
        End If
        If rs!group <> group Then
            rs.Edit
            rs!group = group
            rs.Update
        End If
        rs.MoveNext
    Loop
    rs.Close
    db.Close
End Sub

这会为每一行添加一个组号。现在您可以执行此查询

SELECT
    tblBalance.Group,
    Max([ClosingBalance]-[OpeningBalance]) AS IncreaseInBalance,
    Count(*) AS TotalRowsItAppliesTo
FROM
    tblBalance
GROUP BY
    tblBalance.Group;