условная сумма (sumif) в org-таблице

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

#+NAME: ENTRY
|------+--------|
| Item | Amount |
|------+--------|
| A    |    100 |
| B    |     20 |
| A    |    120 |
| C    |     40 |
| B    |     50 |
| A    |     20 |
| C    |     16 |
|------+--------|

а затем мне нужно суммировать каждый элемент в другой таблице:

#+NAME: RESULT
|------+-----|
| Item | Sum |
|------+-----|
| A    | 240 |
| B    |  70 |
| C    |  56 |
|------+-----|

Я пытался использовать vlookup и удаленную ссылку в этой таблице, но я не могу суммировать полученный список, например:

#+TBLFM: $2=vsum((vconcat (org-lookup-all $1 '(remote(ENTRY,@2$1..@>$1)) '(remote(ENTRY,@2$2..@>$2)))))

Но не дает ответа.

Поэтому я должен использовать заполнитель для хранения результирующего списка, а затем суммировать его:

#+NAME: RESULT
|------+--------------+-----|
| Item | Placeholder  | Sum |
|------+--------------+-----|
| A    | [100 120 20] | 240 |
| B    | [20 50]      |  70 |
| C    | [40 16]      |  56 |
|------+--------------+-----|
#+TBLFM: $2='(vconcat (org-lookup-all $1 '(remote(ENTRY,@2$1..@>$1)) '(remote(ENTRY,@2$2..@>$2))))::$3=vsum($2)

Есть ли лучшее решение для этого?


person kitsusia    schedule 30.08.2014    source источник


Ответы (1)


Один из способов сделать это без vsum:

#+TBLFM: $2='(apply '+ (mapcar 'string-to-number (org-lookup-all $1 '(remote(ENTRY,@2$1..@>$1)) '(remote(ENTRY,@2$2..@>$2)))))

Если вы хотите использовать функцию вычисления, вы всегда можете использовать calc-eval:

#+TBLFM: $2='(calc-eval (format "vsum(%s)" (vconcat (org-lookup-all $1 '(remote(ENTRY,@2$1..@>$1)) '(remote(ENTRY,@2$2..@>$2))))))
person olaf b    schedule 30.08.2014