2015-10-15 5 views
0

У меня есть два числа в таблице, соответствующие разным годам (как показано ниже).Как выполнить арифметическую операцию в MySQL

Как написать SELECT запрос для вычисления разницы в цене между 2014 и 2013

Table 1 sample information: 

year   value 
-------------------- 
2013   100 
2014   150 
+0

вы хотите '2013-100 = 1913', или' 150-100 = 50'? –

+0

a self join with 2 aliases – Drew

+0

@MarcB Мне нужно сделать 150-100 –

ответ

0

Dont как это слишком много, потому что очень специфична. Но это путь без join с помощью условного SUM

SELECT SUM(CASE 
       WHEN year = 2014 THEN value 
       ELSE -value 
      END) as total 
FROM Table1 
+0

, теперь это квалифицируется как [Машина Рубе Голдберга] (https://en.wikipedia.org/wiki/Rube_Goldberg_machine) :) – Drew

+0

@Drew Я знаю: P, Но самая крутая часть выглядит более эффективный, так как другие ответы не являются? –

+0

Мне это нравится. – Drew

0

Я не имею сервера SQL под рукой, чтобы попробовать это, но я хотел бы использовать подзапросы, как это ::

SELECT (SELECT value FROM your_table WHERE year = 2014) - 
     (SELECT value FROM your_table WHERE year = 2013) AS Area 
+0

Что я сделал, основываясь на своем предложении, заключается в следующем: ВЫБРАТЬ (SELECT land_value/поверхностные \t от образца \t WHERE id_neighborhood = 22 и поверхность IS NOT NULL и год = 2014) - (SELECT land_value/поверхность \t ОТ Образец \t ГДЕ id_neighborhood = 22 И поверхность НЕ НУЛЛА И год = 2013); И в результате я получаю [это] (http://i.stack.imgur.com/XM1TT.png) в MySQL Workbench (извините, разные имена полей). Это правильный результат, но он имеет SQL-запрос и никогда раньше не случался со мной, поэтому я не понимаю, почему. –

+0

Да, SQL-сервер сообщает имя столбца на выходе. В этом случае подзапросы представляют собой имя столбца. Вы можете использовать псевдоним с именем AS. Я отредактирую ответ, чтобы продемонстрировать. –

+0

Вы правы. Мой плохой, я забыл псевдоним имени столбца. –

3

хитрость заключается в том, чтобы понять, что вам нужно соединить таблицу к себе так, что вы работаете на строки, которые могут сказать вам кое-что о двух разных лет. Например:

SELECT t1.value-t2.value as difference 
FROM yourtable AS t1 
INNER JOIN yourtable AS t2 
ON(t1.year=2013 AND t2.year=2014) 
2
SELECT (a.value-b.value) as difference from table as a 
INNER JOIN table as b 
on a.year=2014 and b.year =2015 
+0

, пожалуйста, используйте явные объединения в ваших объединениях :) – Drew

+0

изменен, мой плохой, сделал это в спешке – javaguest

+1

@Drew У меня есть эта ссылка, чтобы научить, почему лучше явные объединения. Аарон Бертран сделал несколько [** текст] ** (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) об этом –

1

Первое, что вы должны узнать о реляционных баз данных является то, что любая запись в таблице семантически эквивалентно другим. Я имею в виду: у вас может быть две записи в вашей таблице (2013 и 2014) ... или у вас может быть сотня из них. Итак, вы должны подумать о своем запросе в терминах таблицы с неопределенным номером записей.

Например: Запрос, который вычисляет разницу между какой-либо записи и предыдущий:

Шаг за шагом:

Список всех записей:

SELECT year, value FROM table 

соединения между записями по годам:

SELECT a.year, a.value, b.year, b.value 
FROM table AS a INNER JOIN table AS b ON a.year=b.year 

Соединиться между записями прошлого года:

SELECT a.year, a.value, b.year, b.value 
FROM table AS a INNER JOIN table AS b ON a.year=1+b.year 

Наконец, разница между годом и предыдущий:

SELECT a.year, a.value, b.year, b.value, a.value-b.value 
FROM table AS a INNER JOIN table AS b ON a.year=1+b.year 
0

на основе ответа Хуана, здесь является более «предприятие» способ решения этой проблемы

SELECT a.value - b.value as difference from (select year, value from table = 2014) as a 
INNER JOIN (select year, value from table where year = 2015) as b 
on a.year = 2015 and b.year = 2014 
WHERE a.year = 2015 and b.year = 2014 
1

Общее решение. Предположим, таблица, как этот (названный year_val в качестве примера):

mysql> select * from year_val; 
+------+------+ 
| year | val | 
+------+------+ 
| 2015 | 100 | 
| 2014 | 120 | 
| 2013 | 500 | 
| 2012 | 400 | 
+------+------+ 
4 rows in set (0.01 sec)  

QUERY

SELECT yv1.year AS current_year 
    ,yv2.year AS last_year 
    ,yv1.val AS current_val 
    ,yv2.val AS last_val 
    ,yv2.val - yv1.val AS difference 
FROM year_val yv1 
INNER JOIN year_val yv2 
     ON yv1.year = yv2.year + 1; 

ВЫХОД.

+--------------+-----------+-------------+----------+------------+ 
| current_year | last_year | current_val | last_val | difference | 
+--------------+-----------+-------------+----------+------------+ 
|   2015 |  2014 |   100 |  120 |   20 | 
|   2014 |  2013 |   120 |  500 |  380 | 
|   2013 |  2012 |   500 |  400 |  -100 | 
+--------------+-----------+-------------+----------+------------+ 
+0

Это работает, если это год, и это число. Что, если, например, это названия городов и группы населения, и вы хотите рассчитать разницу между населенными пунктами между двумя конкретными городами? –

+0

@GustavoMoreno Что касается других типов данных, это просто вопрос того, как вы хотите сортировать и что означает «предыдущий» город? Рад, что мой ответ работает на вас. Примите ответ. –

Смежные вопросы