如何编写此求和查询?

时间:2009-06-23 17:07:09

标签: sql database ms-access

我没有设计这张桌子,如果可以的话我会重新设计它,但这对我来说不是一个选择。

我有这张桌子:

Transactions
    Index  --PK, auto increment
    Tenant --this is a fk to another table
    AmountCharged
    AmountPaid
    Balance
    Other Data

使用的软件每次从上一次余额计算余额,如下所示:

previousBalance - (AmountPaid - AmountCharged)

余额是租户真正欠多少钱。

但是,该程序使用Access和并发用户,并且搞砸了。很开心。
例如:我有一个看起来像这样的租户:

Amount Charged | Amount Paid | Balance
      350            0            350
      440            0            790
       0            350          -350      !
       0            440          -790

我想去,并将所有余额重置为它们应该是什么,所以我会有一些运行总计。我不知道Access是否可以使用SP等变量。

我甚至不知道如何开始这个,我假设它是一个子查询的查询,在它的索引之前总结所有费用/付款,但我不知道如何写它。

我该怎么做?


编辑:

我正在使用Access 97

2 个答案:

答案 0 :(得分:2)

假设索引是增量的,而更高的值 - >以后的交易日期,您可以在join子句中使用带有> =条件的自联接,如下所示:

select 
  a.[Index], 
  max(a.[Tenant]) as [Tenant], 
  max(a.[AmountCharged]) as [AmountCharged],
  max(a.[AmountPaid]) as [AmountPaid],
  sum(
    iif(isnull(b.[AmountCharged]),0,b.[AmountCharged])+
    iif(isnull(b.[AmountPaid]),0,b.[AmountPaid])
    ) as [Balance]
from 
  [Transactions] as a
left outer join 
  [Transactions] as b on
    a.[Tenant] = b.[Tenant] and
    a.[Index] >= b.[Index]
group by 
  a.[Index];

Access SQL很繁琐;上面可能有一些语法错误,但这是一般的想法。要在查询设计器中创建此查询,请将“事务”表添加两次,将它们连接到“租户”和“索引”,然后编辑连接(如果可能)。

您可以使用子查询执行相同的操作,例如:

select 
  [Index], 
  [Tenant], 
  [AmountCharged], 
  [AmountPaid], 
    (
      select 
        sum(
          iif(isnull(b.[AmountCharged]),0,b.[AmountCharged])+             
          iif(isnull(b.[AmountPaid]),0,b.[AmountPaid])
          )
      from 
        [Transactions] as b
      where 
        [Transactions].[Tenant] = b.[Tenant] and 
        [Transactions].[Index] >= b.[Index]
    ) as [Balance]
from 
  [Transactions];

计算出适当的余额后,使用更新查询来更新表,方法是将Transactions表连接到Index上面定义的select查询。您可以将它组合成一个更新查询,但这会使测试更加困难。

答案 1 :(得分:0)

如果所有记录都有一个序列号(两者之间没有间隙),您可以尝试以下操作:创建一个查询,将表链接到自身。在连接中,您想要使用Id = Id - 1链接表格。这样,您将每条记录链接到其先前的记录。

如果您没有可用于此目的的列,请尝试添加自动编号列。

其他选项是在VBA中编写一些简单的行来循环记录并更新值。如果是一次性操作,我认为如果你对sql不是很有经验,这将是最简单的。