0
A        B        C       D       E       F    G
date     from     to      amount  account      
5/5/2013 bank     food    200     bank    
5/5/2013 work     bank    1200    food
5/5/2013 bank     rent    400     work
5/5/2013 work     bank    1200    rent

列 F で結果の残高を取得するにはどうすればよいですか?

そして、最もパフォーマンスの高いオプションは何ですか?

値の合計と残りの値は知っていますが、それらを F 列にきれいに配置する方法がわかりません。

私が試したこと

私はこれを作りました:

in H1
=QUERY(A1:D99,"select B, sum(D) where D > 0 group by B")

in J1
=QUERY(A1:D99,"select C, sum(D) where D > 0 group by C")

取得:

H       I             J       K
from    sum Amount    to      sum Amount
bank    600           bank    2400
work    2400          food    200
                      rent    400

さて、k - i を休めばバランスがとれます。しかし、対応する要素に対してこれを行うにはどうすればよいですか? 私は銀行と銀行などを意味します。

4

1 に答える 1

1

アカウントがすでに E2 ダウンにリストされている場合は、F2 に次の配列数式を入力できます。

=ArrayFormula(IF(LEN(E2:E);SUMIF(C2:C;E2:E;D2:D)-SUMIF(B2:B;E2:E;D2:D);IFERROR(1/0)))

これはおそらく、この回答の代替案の中で最高のパフォーマンスを発揮します。ただし、すでに入力されているアカウント名に依存しています。

この数式は、テーブル全体を返します。

=ArrayFormula(QUERY(IF({1,0};TRANSPOSE(SPLIT(CONCATENATE(FILTER(B2:C;LEN(B2:B);LEN(C2:C))&CHAR(9));CHAR(9)));TRANSPOSE(SPLIT(CONCATENATE((FILTER(D2:D;LEN(B2:B);LEN(C2:C))*{-1,1})&CHAR(9));CHAR(9))));"select Col1, sum(Col2) group by Col1 label Col1 'Account', sum(Col2) 'Balance'";0))

しかし、恐ろしく判読できないことは別として、これらのタイプの「連結してから分割する」式は、大規模なデータ セットのパフォーマンスが非常に低下する可能性があります。したがって、通常、この状況ではカスタム関数を使用することを好みます。

function accountBalance(fromAccount, toAccount, amount) {
  var result = [], output = [['Account', 'Balance']], from, to, value;
  for (var i = 0; i < amount.length; i ++) {
    from = fromAccount[i][0];
    to = toAccount[i][0];
    value = amount[i][0];
    if (from && to) {
      if (!(from in result)) result[from] = 0;
      if (!(to in result)) result[to] = 0;
      result[from] -= value;
      result[to] += value;
    }
  }
  for (var j in result) {
    output.push([j, result[j]]);
  }
  return output;
}

次に、スプ​​レッドシートのセルで、次のように呼び出します。

=accountBalance(B2:B;C2:C;D2:D)

于 2013-05-20T02:29:11.463 に答える