Хотя ваш вывод кажется запутанным, тем не менее, я даю следующий ответ:
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
Пожалуйста, объясните выход немного – 1000111
имеет разницу рассчитывались по цене из первый автомобиль с остальным? – 1000111
Позвольте мне обновить свой вопрос ... что будет легко понять. – user3172982