Как я могу написать этот суммирующий запрос? - PullRequest
0 голосов
/ 23 июня 2009

Я не разработал эту таблицу, и я бы изменил ее, если бы мог, но это не вариант для меня.

У меня есть эта таблица:

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 или нет.

Я даже не знаю, как начать с этого, я бы предположил, что это будет запрос с подзапросом для суммирования всех сборов / платежей до его индекса, но я не знаю, как его написать.

Как я могу это сделать?


Edit:

Я использую Access 97

Ответы [ 2 ]

2 голосов
/ 23 июня 2009

Предполагая, что индекс является инкрементным, а более высокие значения -> более поздние даты транзакции, вы можете использовать самообъединение с условием> = в предложении соединения, что-то вроде этого:

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];

Доступ к SQL является неудобным; выше могут быть некоторые синтаксические ошибки, но это общая идея. Чтобы создать этот запрос в конструкторе запросов, дважды добавьте таблицу «Транзакции», объедините их в Tenant и Index, а затем измените объединение (если возможно).

Вы можете сделать то же самое с подзапросом, что-то вроде:

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];

После того, как вы вычислили правильные сальдо, используйте запрос на обновление, чтобы обновить таблицу, соединив таблицу транзакций с запросом выбора, определенным выше для индекса. Возможно, вы могли бы объединить его в один запрос на обновление, но это усложнило бы тестирование.

0 голосов
/ 23 июня 2009

Если все записи имеют порядковый номер (без пробелов между ними), вы можете попробовать следующее: создайте запрос, в котором вы свяжете таблицу с самим собой. В соединении вы указываете, что хотите связать таблицы с Id = Id - 1. Таким образом, вы связываете каждую запись с ее предыдущей записью.

Если у вас нет столбца, который можно использовать для этого, попробуйте добавить столбец автономного номера.

Другой вариант - написать несколько простых строк в VBA, чтобы перебирать записи и обновлять значения. Если это разовая операция, я думаю, что это будет проще всего, если вы не очень разбираетесь в sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...