2015-01-12 67 views
1

我有如下表:減去先前行的值尊重分組

CREATE TABLE `movm` (
    `id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `product` INTEGER NOT NULL, 
    `value` DECIMAL(10, 2) NOT NULL 
    -- ... 
); 

和幾個數據:

INSERT INTO `movm`(`product`, `value`) VALUES 
    (1, 1000), 
    (1, -200), 
    (1, 100), 
    (2, 50), 
    (2, -10), 
    (1, 100), 
    (2, -20); 

而且我希望得到以下結果:

+----+---------+---------+----------+---------+ 
| id | product | value | previous | current | 
+----+---------+---------+----------+---------+ 
| 1 |  1 | 1000.00 |  0 | 1000 | 
| 2 |  1 | -200.00 |  1000 |  800 | 
| 3 |  1 | 100.00 |  800 |  900 | 
| 6 |  1 | 100.00 |  900 | 1000 | 
| 4 |  2 | 50.00 |  0 |  50 | 
| 5 |  2 | -10.00 |  50 |  40 | 
| 7 |  2 | -20.00 |  40 |  20 | 

但始終尊重GROUP BY產品

我試過下面的SQL:

SELECT 
    `id`, 
    `product`, 
    `value`, 
    @previous := (@current)   AS `previous`, 
    @current := (@current + `value`) AS `current` 
    FROM 
     `movm`, 
     (
      SELECT 
       @previous := 0, 
       @current := 0 
     ) AS `__movm`; 

因爲它不尊重組,它總是總結的一切,而且也沒有決勝局。

已經做過IF(@product != product, @current := 0, NULL);作品,但不是那麼靈活。我還需要僅跟蹤該產品的值,繞過任何順序,如您所見,它們沒有排序(我認爲這很容易解決在子查詢中包裝當前SQL)。

因此:有沒有更好的解決方案,我可以使用GROUP BY product並獲得預期的結果如圖所示?

+0

如何使用@product!= product ..'的方法不靈活?我認爲這是MySQL的最佳選擇。 –

回答

2

您需要有另一個變量來跟蹤產品,並且您還需要order by,以便您可以在產品價值更改時更改product變量並重置counters

這將工作。

SELECT 
    id, 
    product, 
    value, 
    @previous := IF(@prevProduct = product,@current,0)   AS previous, 
    @current := IF(@prevProduct = product, @current + value, value) AS current, 
    @prevProduct := product as var_val 
    FROM 
    movm, 
     (
      SELECT 
       @previous := 0, 
       @current := 0, 
       @prevProduct := NULL 
     ) AS `__movm` 
    ORDER BY product