SQLite3 обновляет таблицу, добавляя и вычитая значения согласованным образом в одном запросе - PullRequest
0 голосов
/ 28 апреля 2020

В качестве примера у меня есть эта таблица:

table accounts:
type  | value
a       100
a       200
a       300
b       100

, и мне нужно увеличить на 1% все счета типа 'a', а затем вычесть из счета типа b итоговую сумму ( значение) не изменяется:

type  | value
a       101
a       202
a       303
b       94

Можно ли как-нибудь сделать это в одном обновлении?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы можете использовать выражение CASE и подзапрос, который получает сумму.

UPDATE accounts
       SET value = CASE
                     WHEN type = 'a' THEN
                       value * 1.01
                     WHEN type = 'b' THEN
                       value - (SELECT sum(value / 1.01 * .01)
                                       FROM accounts
                                       WHERE type = 'a')
                     ELSE
                       value
                   END;

db <> fiddle

0 голосов
/ 28 апреля 2020

Порядок строк, которые будут обновлены, не предопределен, поэтому вам нужно 2 оператора обновления: 1-й обновит строку с типом = 'b', а 2-й строки с типом = 'a':

update accounts
set value = value - (select sum(0.01 * value) from accounts where type = 'a')
where type = 'b';

update accounts
set value = 1.01 * value
where type = 'a';

См. Демоверсию . Результаты:

| type | value |
| ---- | ----- |
| a    | 101   |
| a    | 202   |
| a    | 303   |
| b    | 94    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...