Накопительная сумма в MySQL с предложением ORDER BY - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу иметь накопительный столбец в MySQL. Когда я использую команду SQL без предложения ORDER BY, это нормально. Но с предложением ORDER BY результат неправильный.

Мой оператор SQL:

SET @LastSumFee := 1000;
SELECT HioId, ApplyDate, ApplyTime, Idx, InputFee, OutputFee, (@LastSumFee := @LastSumFee + InputFee - OutputFee) AS SumFee
FROM HsbInOutView
WHERE HnId = 9 OR LHnId = 9
LIMIT 5;

Для этого sql результат в порядке (этот результат создается с помощью phpMyAdmin):

HioId   ApplyDate   ApplyTime   Idx     InputFee    OutputFee   SumFee  
168     1381/10/10  00:00:00    11      1085945     0           1086945
169     1381/10/21  00:00:00    12      0           600000      486945
170     1381/10/02  00:00:00    10      0           700000      -213055
171     1381/10/01  00:00:00    9       0           600000      -813055
180     1381/05/26  00:00:00    3       782040      0           -31015

Теперь, если я добавлю ORDER BY к команде SQL следующим образом:

SET @LastSumFee := 1000;
SELECT HioId, ApplyDate, ApplyTime, Idx, InputFee, OutputFee, (@LastSumFee := @LastSumFee + InputFee - OutputFee) AS SumFee
FROM HsbInOutView
WHERE HnId = 9 OR LHnId = 9
ORDER BY ApplyDate, ApplyTime, Idx
LIMIT 5;

Я получаю неправильный результат (этот результат создается с помощью phpMyAdmin):

HioId   ApplyDate   ApplyTime   Idx     InputFee    OutputFee   SumFee  
193     1380/08/08  00:00:00    1       50000       0           4444879
1334    1380/08/08  00:00:00    36      0           50000       -6897369
194     1381/04/30  00:00:00    2       889100      0           5333979
1169    1381/04/30  00:00:00    127     0           889100      15774756
180     1381/05/26  00:00:00    3       782040      0           -31015

Ожидаю результата ниже:

HioId   ApplyDate   ApplyTime   Idx     InputFee    OutputFee   SumFee  
193     1380/08/08  00:00:00    1       50000       0           51000
1334    1380/08/08  00:00:00    36      0           50000       1000
194     1381/04/30  00:00:00    2       889100      0           890100
1169    1381/04/30  00:00:00    127     0           889100      1000
180     1381/05/26  00:00:00    3       782040      0           783040

1 Ответ

0 голосов
/ 04 ноября 2018

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

SELECT HioId, ApplyDate, ApplyTime, Idx, InputFee, OutputFee, 
       (@LastSumFee := @LastSumFee + InputFee - OutputFee) AS SumFee
FROM (SELECT v.*
      FROM HsbInOutView v
      WHERE HnId = 9 OR LHnId = 9
      ORDER BY ApplyDate, ApplyTime, Idx
     ) v CROSS JOIN
     (SELECT @LastSumFee := 1000) params
LIMIT 5;

Конечно,

( 1000 + SUM(InputFee - OutputFee) OVER (ORDER BY ApplyDate, ApplyTime, Idx) ) as SumFee

намного проще.

...