简体   繁体   中英

How to subtract column's old value from the new one in mysql

My question is same as this one on SO , but difference is what should we do if random incremented id not continues.

QUERY

create table sales_table (no int, date varchar(10), sales int);

insert into sales_table values (1, '1-Jan', 10000),
                               (3, '3-Jan', 12500),
                               (5, '4-Jan', 8000);

EXPECTED RESULT

+-------+------------+--------------+-------------+
| no    |    date    |     sales    |      diff   |        
+-------+------------+--------------+-------------+
| 1     |    1-Jan   |     10,000   |       0     |         
| 3     |    3-Jan   |     12,500   |       2500  |            
| 5     |    4-Jan   |     8,000    |      -4500  | 
+-------+------------+--------------+-------------+

Why a subquery?

SELECT
    no,
    date,
    IF(@sales = 0, 0, sales - @sales) diff,
    @sales := sales AS sales
FROM
    sales_table, (SELECT @sales := 0) x 
ORDER BY no;

Output:

+------+-------+-------+-------+
| no   | date  | diff  | sales |
+------+-------+-------+-------+
|    1 | 1-Jan |     0 | 10000 |
|    3 | 3-Jan |  2500 | 12500 |
|    5 | 4-Jan | -4500 |  8000 |
+------+-------+-------+-------+

you can use user defined variable to store the previous row value of sales

SELECT 
t1.no,
t1.date,
t1.sales,
t1.diff
FROM (
SELECT 
*,
CASE WHEN @rownum = 0 THEN 0 ELSE s.sales - @prev END AS diff,
@prev:=s.sales,
@rownum:= @rownum +1 rownum
FROM sales_table s
CROSS JOIN (SELECT @prev:=0,@rownum:=0) t
ORDER BY s.no
) t1

Demo

QUERY

SELECT
curr.no,
curr.date,
curr.sales,
COALESCE(IFNULL(curr.sales, 0) - next.sales,0) AS Diff
FROM sales_table  AS curr
LEFT JOIN sales_table AS next
ON next.no = 
(SELECT MAX(no) 
FROM sales_table 
WHERE no < curr.no)

FIND FIDDLE HERE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM