2015-10-15 101 views
0

我在一個表中對應於不同年份的兩個數字(如下所示)。如何在MySQL中進行算術運算

我怎樣寫一個SELECT查詢來計算2014年和2013年

Table 1 sample information: 

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

你想'2013-100 = 1913',或'150-100 = 50'? –

+0

自我加入2個別名 – Drew

+0

@MarcB我需要做150-100 –

回答

0

不喜歡它太多,因爲是非常具體的。但是,這是不join方式使用有條件SUM

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

現在可以作爲[Rube Goldberg機器](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/surface \t FROM Sample \t WHERE id_neighborhood = 22 AND surface is NOT NULL AND year = 2013); 因此,我在MySQL Workbench中得到[this](http://i.stack.imgur.com/XM1TT.png)(抱歉,不同的字段名稱)。 這是正確的結果,但它附帶了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 

A記錄之間的連接

一步一步:即計算前一個任何記錄之間的差異查詢按年份:

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; 

OUTPUT

+--------------+-----------+-------------+----------+------------+ 
| 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對於其他數據類型,這只是一個你想如何排序的問題,無論如何,「前一個」城市意味着什麼?很高興我的答案適合你。請接受答案。 –