Как использовать сумму над разделом (без оконной функции) в MySQL 5.7 - PullRequest
1 голос
/ 27 июня 2019

Я хочу знать, как движок mysql 5.7 работает так же, как сумма по части. Невозможно заменить механизм запросов, потому что это не личная операция.

Была попытка разрешить ее с помощью функции переменной @set, но мне трудно получить кумулятивную сумму для каждого из четырех столбцов.

Я посмотрел на ссылку ниже, но это было немного трудно решить. как ранжировать раздел в MySql

Мой стол

id      a      b     c     d
----------------------------
abs     1      0     0     1
abs     0      1     1     0
abs     1      0     1     0
abs     1      1     1     1
qwe     0      0     0     0
qwe     0      0     0     1
qwe     1      0     1     0
qwe     1      1     0     1
trx     0      1     1     0
trx     1      1     0     0

Ожидаемое

id      a      b     c     d
----------------------------
abs     1      0     0     1
abs     1      1     1     1
abs     2      1     2     1
abs     3      2     3     2
qwe     0      0     0     0
qwe     0      0     0     1
qwe     1      0     1     1
qwe     2      1     1     2
trx     0      1     1     0
trx     1      2     1     0

Заранее спасибо.

1 Ответ

0 голосов
/ 27 июня 2019

Вам нужны кумулятивные суммы для каждого столбца.Чтобы это работало, вам нужен столбец, в котором указан порядок - таблицы SQL представляют неупорядоченные наборы.

Если у вас есть такой столбец, то часто будет работать следующее:

select t.*,
       (@a := if(@id = id, @a + a, 0)) as a,
       (@b := if(@id = id, @b + b, 0)) as b,
       (@c := if(@id = id, @c + c, 0)) as c,
       (@d := if(@id = id, @d + d, 0)) as d,
       @id := id
from (select t.*
      from t
      order by t.id, ?  -- column for the ordering
     ) t cross join
     (select @id := -1, @a := 0, @b := 0, @c := 0 @d := 0) params;

Однако это не гарантированно для работы, потому что MySQL не гарантирует порядок вычисления выражений в SELECT.Итак, я думаю, что подзапросы могут быть самым простым методом:

select t.id,
       (select sum(t2.a) from t t2 where t2.id = t.id and t2.? <= t.?) as a,
       (select sum(t2.b) from t t2 where t2.id = t.id and t2.? <= t.?) as b,
       (select sum(t2.c) from t t2 where t2.id = t.id and t2.? <= t.?) as c,
       (select sum(t2.d) from t t2 where t2.id = t.id and t2.? <= t.?) as d
from t;
...