我有一张桌子。它有这些列,比方说:
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
-------------------------------------------------------------------
您会注意到某些行没有OpeningBalance
和ClosingBalance
列的值。
ClosingBalance
始终大于OpeningBalance
。
我们要计算一行的余额增量(ClosingBalance
- OpeningBalance
)。然后,我们要计算该行下面有多少行有OpeningBalance
和ClosingBalance
的空白值,直到有一行值。然后,我们将显示如下所示的摘要。
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之类的东西?我想拥有这项工作的组织假设这些行被认为是将它们输入数据库的顺序。
有出路吗?
答案 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;