Создайте столбец совокупной суммы в MySQL

У меня есть таблица, которая похожа на это:

id   count
1    100
2    50
3    10

Я хочу добавить новый столбец, названный cumulative_sum, таким образом, таблица была бы похожа на это:

id   count  cumulative_sum
1    100    100
2    50     150
3    10     160

Существует ли оператор обновления MySQL, который может сделать это легко? Что лучший способ состоит в том, чтобы выполнить это?

69
задан Reinstate Monica 6 August 2015 в 10:07
поделиться

4 ответа

Если производительность является проблемой, вы можете использовать переменную MySQL:

set @csum := 0;
update YourTable
set cumulative_sum = (@csum := @csum + count)
order by id;

В качестве альтернативы вы можете удалить столбец cumulative_sum и вычислить его для каждого запроса:

set @csum := 0;
select id, count, (@csum := @csum + count) as cumulative_sum
from YourTable
order by id;

Это вычисляет текущую сумму в бегущий путь :)

84
ответ дан 24 November 2019 в 13:38
поделиться
UPDATE t
SET cumulative_sum = (
 SELECT SUM(x.count)
 FROM t x
 WHERE x.id <= t.id
)
3
ответ дан 24 November 2019 в 13:38
поделиться

Использование коррелированного запроса:


  SELECT t.id,
         t.count,
         (SELECT SUM(x.count)
            FROM TABLE x
           WHERE x.id <= t.id) AS cumulative_sum
    FROM TABLE t
ORDER BY t.id

Использование переменных MySQL:


  SELECT t.id,
         t.count,
         @running_total := @running_total + t.count AS cumulative_sum
    FROM TABLE t
    JOIN (SELECT @running_total := 0) r
ORDER BY t.id

Примечание:

  • JOIN (SELECT @running_total: = 0 ) r - это перекрестное соединение, которое позволяет объявлять переменные, не требуя отдельной команды SET .
  • Псевдоним таблицы, r , требуется MySQL для любого подзапроса / производной таблицы / встроенного представления

Предостережения:

  • специфично для MySQL; не переносится в другие базы данных
  • ЗАКАЗ важен; он обеспечивает соответствие порядка OP и может иметь более серьезные последствия для более сложного использования переменных (IE: функция psuedo ROW_NUMBER / RANK, которой не хватает MySQL)
100
ответ дан 24 November 2019 в 13:38
поделиться

Вы также можете создать триггер, который будет вычислять сумму перед каждой вставкой

delimiter |

CREATE TRIGGER calCumluativeSum  BEFORE INSERT ON someTable
  FOR EACH ROW BEGIN

  SET cumulative_sum = (
     SELECT SUM(x.count)
        FROM someTable x
        WHERE x.id <= NEW.id
    )

    set  NEW.cumulative_sum = cumulative_sum;
  END;
|

Я не тестировал это

1
ответ дан 24 November 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: