【问题标题】:How can I write this summing query?我该如何编写这个求和查询?
【发布时间】:2009-06-23 17:07:09
【问题描述】:

这张桌子不是我设计的,如果可以的话我会重新设计,但这不是我的选择。

我有这张桌子:

交易 索引--PK,自动递增 租户——这是另一个表的 fk 收费金额 支付的金额 平衡 其他数据

使用的软件每次都从以前的余额计算余额,如下所示:

previousBalance - (AmountPaid - AmountCharged)

余额是租户的实际欠款。

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

收费金额 |支付金额 |平衡 350 0 350 440 0 790 0 350 -350 ! 0 440 -790

但我想将所有余额重置为应有的水平,所以我会有某种运行总计。我不知道Access是否可以使用SP之类的变量。

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

我该怎么做?


编辑:

我正在使用 Access 97

【问题讨论】:

  • 您是指 Access 97 还是 Access 2000? 2000 是第 9 版。我从未听说过 99。
  • access.exe 说它是 8.0.0.3512

标签: sql database ms-access


【解决方案1】:

假设索引是递增的,并且值更高 --> 交易日期较晚,您可以在连接子句中使用带有 >= 条件的自连接,如下所示:

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 很繁琐;上面可能有一些语法错误,但这是一般的想法。要在查询设计器中创建此查询,请将 Transactions 表添加两次,将它们连接到租户和索引上,然后编辑连接(如果可能)。

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

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 上定义的选择查询。您可能可以将其合并到一个更新查询中,但这会使测试变得更加困难。

【讨论】:

  • 使用父查询数据的语法不起作用。它会要求 a.Tenant 和 a.Index
  • 这可能是早期版本的 Access 的别名问题,因此我已删除父查询中的表别名。我没有在本地安装 Access,所以我无法实际测试它。祝你好运!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多