My question is same as this one on SO , but difference is what should we do if random incremented id
not continues.
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);
+-------+------------+--------------+-------------+
| 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
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)
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.