2016-03-04 4 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 

Я знаю, что у меня нет идентификатора 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 сравнивается с ценой остальных автомобилей. Таким образом, результат показывает null для car 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

Try This

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

Добавьте «ЗАКАЗ 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;