我有一個表,每行持有名爲id(鍵),日期,符號,值的字段。Mysql的累計總和,與復位條件,按期限組
符號= 0是重置條件。它將用於設置初始累積值
Sign = +1是一個添加條件。它會將價值累計到累計總額。
Sign = -1是一個減法,正如你猜測的那樣,它會減少累計總數。
順序很重要,所以它們必須用0,1,1順序進行評估。
比方說,我想要獲得價值的累計總和。
SELECT my_date, my_sign, my_value, @cum AS cum_before,
(@cum := IF(my_sign !=0, @cum + my_sign * my_value, my_value)) AS cum_after
FROM my_table, (SELECT @cum :=0) as t WHERE my_date LIKE '2016-05-%'
ORDER BY my_date, my_sign + (my_sign =0) *2 DESC;
將正確顯示:
my_date my_sign my_value cum_before cum_after
2016-05-02 0 10000.00 0 10000.00
2016-05-02 1 1860.00 10000 11860.00
2016-05-02 -1 1860.00 11860 10000.00
2016-05-03 1 1780.00 10000 11780.00
2016-05-06 1 4625.00 11780 16405.00
2016-05-09 1 14200.00 16405 30605.00
現在我想通過周(或月)基時,它,並且具有cum_before組中處理的行之前,設定爲初始值(順便應該是前一組的cum_after),cum_after作爲處理組中行後的累積值。 事情變得複雜,因爲之前的狀態變量@cum似乎用組集的第一個值初始化。
我正在創建一個臨時表來保持正確的順序,因爲GROUP似乎不遵守任何ORDER BY子句(我猜它正在取出行,因爲它們出現在數據庫中)。
CREATE TEMPORARY TABLE _t_ SELECT id FROM my_table
ORDER BY my_date, my_sign + (my_sign =0) *2 DESC ;
我使用分配到位(@cum:=值),SUM函數內,分組時相應地改變@cum,和由0乘以不與真實的總和干擾,這將總結在正常情況下標記*值,當找到復位條件時,將減去@cum和增加值字段。
SELECT min(my_date) AS MinDate, max(my_date) AS MaxDate,
@cum AS cum_before, SUM(
0 * (@cum := IF(my_sign !=0, my_sign * my_value, my_value)) +
IF(my_sign !=0, my_sign * my_value, - @cum + my_value)
) AS cum_after
FROM my_table as F, _t_, (SELECT @cum :=0) AS t
WHERE _t_.id = F.id AND my_date LIKE '2016-05-%'
GROUP BY date_format(my_date, "%y%U");
將爲下列:
MinDate MaxDate cum_before cum_after
2016-05-02 2016-05-06 10000 16405.00
2016-05-09 2016-05-09 14200 14200.00
這是不對的,因爲我所期望獲得的是:
MinDate MaxDate cum_before cum_after
2016-05-02 2016-05-06 0 16405.00
2016-05-09 2016-05-09 16405 30605.00
基本上它似乎分配@cum第一行中的設置,而不是保留以前的變量值。
如何才能獲得正確的分組?