2016-03-04 159 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;