2016-03-04 179 views
0

我想通过给定的以下数据从2行得到汽车的价格差异。 我想价格。减去前柱(200-100),(300-200)等数据行之间的Mysql差异

我的表:

enter image description here

My desired output:

我曾尝试

select t1.row_num1,t1.car_name 
from 
(
    select (@row_num := @row_num +1) as row_num1 ,(select @row_num =0) r1, car_name,price 
    from car 
)t1 

我知道我没有id column.hence我正在生成row_number。 现在我遇到了问题,自我加入这张表,并得到不同。 你的帮助是可观的。

+0

请解释输出位 – 1000111

+0

有差异被反对的价格计算与其余的第一辆车? – 1000111

+0

让我更新我的问题......这将很容易理解 – user3172982

回答

1

虽然你的输出显得扑朔迷离。然而我给了以下的答案:

SOLUTION #1

SELECT 
carsTable1.car_name, 
carsTable1.price, 
CASE WHEN ABS(carsTable1.price - (SELECT price FROM cars WHERE car_name='car 2')) = 0 THEN NULL ELSE 
     ABS(carsTable1.price - (SELECT price FROM cars WHERE car_name='car 2')) END diff 
FROM 
(SELECT 
    @rn := @rn + 1 row_number, 
    cars.car_name, 
    cars.price 
FROM cars, (SELECT @rn := 0) var 
) carsTable1; 

Demo Here

样品输入:

car_name price 

car 1  100 

car 2  200 

car 3  300 

样本输出:

car_name price  diff 

    car 1  100  100 

    car 2  200  NULL 

    car 3  300  100 

注:car 2价格与汽车的其余部分的价格进行比较。所以结果显示nullcar 2,因为它是参考车。


如果我误解了你的要求,那么它一定是:你想连续行即之间的价格差异(No car,car1),(car1,car2), (car2,car3), (car3,car4)....

所以在这种情况下,你可以通过下面的查询:

SOLUTION #2

SELECT 
car_name, 
cars.price, 
CASE WHEN @currentPrice = 0 THEN NULL ELSE ABS(cars.price - @currentPrice) END AS diff, 
@currentPrice := price 
FROM cars ,(SELECT @currentPrice := 0) var 
ORDER BY car_name 

SQL FIDDLE BASED ON THIS QUERY


如果你想omit the fourth column

SELECT 
t.car_name, 
t.price, 
t.diff 
FROM 
(
    SELECT 
    car_name, 
    cars.price, 
    CASE WHEN @currentPrice = 0 THEN NULL ELSE (cars.price - @currentPrice) END AS diff, 
    @currentPrice := price 
    FROM cars ,(SELECT @currentPrice := 0) var 
    ORDER BY car_name) t 

SQL FIDDLE BASED ON THIS QUERY

+0

如果符合您的要求,请您检查一下吗? @ user3172982 – 1000111

1

尝试这个

set @next_row_price := null; 
SELECT car_name , price, diff FROM(
    SELECT car_name,price,(@next_row_price - price) * -1 AS diff, 
    IF(@next_row_price IS NULL, @next_row_price := price, 0) , 
    IF(@next_row_price IS NOT NULL, @next_row_price := price, 0) 
FROM car 
) AS TEMP; 

SQLFiddle

+0

无论如何不需要设置它为NULL的变量。 – Mihai

+1

将'ORDER BY car_name'添加到派生表中,否则结果将基于插入顺序... – dnoeth

+0

在他的愿望输出中,没有'order by'的要求 –

0

试试这个: -

CREATE TABLE #TempTable (rownum INT, price int, car_name VARCHAR(256)); 
INSERT INTO #TempTable (rownum, price, car_name) 
SELECT 
rownum = ROW_NUMBER() OVER (ORDER BY c.car_id), 
c.price, 
c.car_name 
FROM car c; 
SELECT 
    NEX.car_name + '-' + TT.car_name, 
    (nex.price - tt.price) AS Differences 
    FROM #TempTable TT 
LEFT JOIN #TempTable prev ON prev.rownum = TT.rownum - 1 
LEFT JOIN #TempTable nex ON nex.rownum = TT.rownum + 1;